您的位置:首页 > 其它

POJ 2607 Fire Station(Floyd)

2016-02-12 13:26 302 查看
Description

有n个城市,其中的m个城市有消防站,部分城市之间有道路通行,现要新建一个消防站以最小化每个城市距消防站的最大距离,输出这个最小距离

Input

第一行两个整数m和n分别表示已有消防站的城市个数和总城市个数,第二行m个整数表示有消防站的城市编号,之后每行三个整数u,v,c表示城市u和城市v之间有长度为c的道路,以文件尾结束道路输入(n<=500)

Output

输出最小化的城市距消防站最大距离

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

Solution

首先一遍Floyd求任意两城市之间最短距离,然后枚举每个城市,设其新建消防站后更新消防站距各城市最大距离,并更新答案

Code

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 501
#define INF 0x3f3f3f3f
int n,m,cost[maxn][maxn],dis[maxn],vis[maxn];
int main()
{
while(~scanf("%d%d",&m,&n))
{
int u,v,c;
for(int i=1;i<=n;i++)
{
dis[i]=INF;vis[i]=0;
for(int j=1;j<=n;j++)
cost[i][j]=i==j?0:INF;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&u);
dis[u]=0;
vis[u]=1;
}
while(~scanf("%d%d%d",&u,&v,&c))
cost[u][v]=cost[v][u]=c;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]);
for(int i=1;i<=n;i++)
if(vis[i])
for(int j=1;j<=n;j++)
dis[j]=min(dis[j],cost[i][j]);
int ans=INF,pos;
for(int i=1;i<=n;i++)
{
int temp=-1;
for(int j=1;j<=n;j++)
temp=max(temp,min(dis[j],cost[i][j]));
if(ans>temp)ans=temp,pos=i;
}
printf("%d\n",pos);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: