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


• 本文已收录于以下专栏：

## zoj 3820 Building Fire Stations(二分+bfs)

• u011328934
• 2014年10月13日 09:08
• 1308

## poj2607 Fire Station

• xinge008
• 2012年08月28日 11:08
• 936

## NYOJ 210 Fire Station

• hlg1995
• 2017年04月28日 19:15
• 83

## POJ 2607 Fire Station

• 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
• 2014年08月16日 16:35
• 854

## UVa 10278 - Fire Station

• mobius_strip
• 2014年11月12日 12:16
• 885

## ZOJ1857 Fire Station

• 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
• 2015年07月29日 21:25
• 277

## poj 2607 Fire Station

• 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
• 2014年08月11日 08:03
• 371

举报原因： 您举报文章：Fire Station 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)