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