Fire Station

翻译 2015年11月17日 21:10:56

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;
}


zoj 3820 Building Fire Stations(二分+bfs)

题目链接:zoj 3820 Building Fire Stations 题目大意:给定一棵树,选取两个建立加油站,问说所有点距离加油站距离的最大值的最小值是多少,并且任意输出一种建立加油站的方...
  • u011328934
  • u011328934
  • 2014年10月13日 09:08
  • 1308

poj2607 Fire Station

题意是:在一个城市里有一些消防站,但是市民抱怨这些消防站离他们太远了,希望政府能新建一些消防站,让他们离这些新建的消防站比原有的消防站近一些。思路:可以利用Floyd求出各点之间的最短距离,然后枚举每...
  • xinge008
  • xinge008
  • 2012年08月28日 11:08
  • 936

NYOJ 210 Fire Station

原题链接 题意:有f个消防站已经建在十字路口,n个十字路口,每个路口附近都有居民居住,有些居民抗议他离最近的消防站太远了,所以现在需要再建 一个消防站,使得所有居民最近消防站最远的距离最近(有点拗...
  • hlg1995
  • hlg1995
  • 2017年04月28日 19:15
  • 83

POJ 2607 Fire Station

枚举+最短路问题。 题意依然晦涩难懂。 新建一个消防站n 可以使得所有交叉路口到最近的一个消防站的距离中最大值减小,且n 是满足条件的交叉路口序号中序号最小的。 先每个消防站做S...
  • dongshimou
  • dongshimou
  • 2014年07月21日 13:53
  • 687

ZOJ-1857(POJ-2607) Fire Station

Fire Station Time Limit: 2 Seconds      Memory Limit: 65536 KB A city is served by a number of...
  • u012325552
  • u012325552
  • 2014年08月16日 16:35
  • 854

UVa 10278 - Fire Station

题目:一个城市有i个小镇,其中有一些有消防站,现在想增加1个消防站,使得所有小镇到最近的消防站的距离中的最大值最小。 分析:图论,最短路。利用spfa算法可以高效解决本问题。             ...
  • mobius_strip
  • mobius_strip
  • 2014年11月12日 12:16
  • 885

ZOJ1857 Fire Station

话说这题本来书上说用floyd就能写出来了,但是我写的只能在POJ上过,
  • u013748887
  • u013748887
  • 2014年08月16日 05:55
  • 463

HDU 3656 Fire station

Problem Description A city's map can be seen as a two dimensional plane. There are N houses in th...
  • jtjy568805874
  • jtjy568805874
  • 2015年07月29日 21:25
  • 277

poj 2607 Fire Station

城市要新建一些消防站,减少居民
  • u011366828
  • u011366828
  • 2014年07月20日 17:01
  • 380

poj 2607 Fire Station(floyd)

Fire Station Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3680   A...
  • u014569598
  • u014569598
  • 2014年08月11日 08:03
  • 371
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fire Station
举报原因:
原因补充:

(最多只允许输入30个字)