Fire Station

Description

A city is served by a number of fire stations. Some residents have complained that the distance from their houses to the nearest station is too far, so a new station is to be built. You are to choose the location of the fire station so as to reduce the distance to the nearest station from the houses of the disgruntled residents.

The city has up to 500 intersections, connected by road segments of various lengths. No more than 20 road segments intersect at a given intersection. The location of houses and firestations alike are considered to be at intersections (the travel distance from the intersection to the actual building can be discounted). Furthermore, we assume that there is at least one house associated with every intersection. There may be more than one firestation per intersection.


Input



The first line of input contains two positive integers: f,the number of existing fire stations (f <= 100) and i, the number of intersections (i <= 500). The intersections are numbered from 1 to i consecutively. f lines follow; each contains the intersection number at which an existing fire station is found. A number of lines follow, each containing three positive integers: the number of an intersection, the number of a different intersection, and the length of the road segment connecting the intersections. All road segments are two-way (at least as far as fire engines are concerned), and there will exist a route between any pair of intersections.

Subsequent test cases are separated with a single blank line.


Output



You are to output a single integer for each test case: the lowest intersection number at which a new fire station should be built so as to minimize the maximum distance from any intersection to the nearest fire station.


Sample Input



1 6
2
1 2 10
2 3 10
3 4 10
4 5 10
5 6 10
6 1 10


Sample Output



5


这道题意思真难懂,首先输入数据,第一行两个数分别表示消防站和十字路口的个数,

第二行表示消防站所在的路口,接下来若干行表示每个十字路口的相连和长度,最后

输入会有一个空行结束(坑死在这里了),找到每个十字路口距离最近的消防站,求出

在最小坐标建立消防站使得最远距离最小。


可以先求出每个消防站到每个点的距离,统计每个点的最小值就是各点到消防站的最

短路,统计一个最大就是得到距离消防站最远距离是多少了,然后对每个没有处理

的十字路口进行假设此处有一个消防站,求出距离最近的消防站的最大距离是否比

开始求出的最大值小,如果小那么此点设一个消防站就更优一些。

#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 505;
int f[maxn], dis[maxn], m, ans[maxn];
bool vis[maxn];
char str[maxn];
struct node
{
    int v, len;
} t;
vector < node > mp[maxn];
queue < int > q;
void init ( )
{
    for ( int i = 0; i <= m; i ++ )
        mp[i].clear ( );
    memset ( ans, 0x3f, sizeof ( ans ) );
    memset ( f, 0, sizeof ( f ) );
}
inline int Max ( int a, int b )
{
    return a > b ? a : b;
}
inline int Min ( int a, int b )
{
    return a < b ? a : b;
}
void spfa ( int s ) //求单源最短路
{
    for ( int i = 1; i <= m; i ++ )
        vis[i] = false, dis[i] = INF;
    while ( ! q.empty ( ) )
        q.pop ( );
    dis[s] = 0;
    q.push ( s );
    while ( ! q.empty ( ) )
    {
        int u = q.front ( );
        q.pop ( );
        vis[u] = false;
        for ( int i = 0; i < mp[u].size ( ); i ++ )
        {
            t = mp[u][i];
            if ( t.len+dis[u] < dis[t.v] )
            {
                dis[t.v] = t.len+dis[u];    //更新s-v的最短路
                if ( vis[t.v] == false )    //没有进队列
                {
                    vis[t.v] = true;
                    q.push ( t.v );
                }
            }
        }
    }
}
void print ( )
{
    for ( int i = 1; i <= m; i ++ )
        printf ( "%d ", dis[i] );
    printf ( "\n" );
}
int main ( )
{
    int n, x, u, v, l, res, id;
    while ( ~ scanf ( "%d%d", &n, &m ) )
    {
        init ( );
        for ( int i = 0; i < n; i ++ )
        {
            scanf ( "%d", &x );
            f[x] = 1;
        }
        getchar ( );
        while ( gets ( str ) && strlen ( str ) )    //注意这里是多组,不是m组
        {
            sscanf ( str, "%d%d%d", &u, &v, &l );
            t.v = v, t.len = l;
            mp[u].push_back ( t );
            t.v = u;
            mp[v].push_back ( t );
        }
        for ( int i = 1; i <= m; i ++ )
        {
            if ( f[i] ) //求出每个消防站到每个十字路口的距离
            {
                spfa ( i );
                for ( int j = 1; j <= m; j ++ )
                //找每个十字路径距离最近的消防站
                    ans[j] = Min ( ans[j], dis[j] );
                //print ( );
            }
        }
        res = 0;
        for ( int i = 1; i <= m; i ++ ) //找距离最远
            res = Max ( res, ans[i] );
        id = 1;
        for ( int i = 1; i <= m; i ++ )
        {
            if ( f[i] == 0 )    //对每个没求过的十字路口假设设定一个消防站,求出最优值
            {
                spfa ( i );
                int mx = 0;
                for ( int j = 1; j <= m; j ++ ) //找距离最近的最大值
                    mx = Max ( mx, Min ( ans[j], dis[j] ) );
                if ( mx < res ) //res大于mx证明在i这个位置更优一些
                {
                    res = mx;
                    id = i;
                }
            }
        }
        printf ( "%d\n", id );
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值