POJ 2607 Fire Station(Floyd)

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

你可能感兴趣的:(POJ 2607 Fire Station(Floyd))