Description
给出n个公寓的互相距离,选择在其中一个公寓楼下建食堂,要求食堂到最远的公寓的距离最短。
Input
每组数据第一行为两个正整数n,m。
n表示公寓数,m表示可彼此直达的公寓对。
接下来m行每行给出两个彼此可直达的公寓i、j和它们之间的距离k。
2 <= n <= 100,0 <= m < (n - 1) * n / 2,0 <= i,j < n,0 < k < 10000。
Output
输出一行一个整数表示建好的食堂到最远的公寓的距离。
若无法建一个能到所有公寓的食堂,输出can not。
Sample Input
3 2
0 2 0
0 1 9
5 3
3 4 8
2 4 1
0 2 0
Sample Output
9
Can not
HINT
题目大意:给出n个公寓的互相距离,选择在其中一个公寓楼下建食堂,要求食堂到最远的公寓的距离最短。
使用floyd求最短路,最短距离存在dist[N][N]中,然后求每行的最大值,再在这些最大值中求最小值。
题目大意:给出n个公寓的互相距离,选择在其中一个公寓楼下建食堂,要求食堂到最远的公寓的距离最短。
使用floyd求最短路,最短距离存在dist[N][N]中,然后求每行的最大值,再在这些最大值中求最小值。
#include <stdio.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define INF 0x7ffffff
#define N 100
int dist[N][N];
int main()
{
int i,j,k,n,m,a,b,d,ans;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
for(j=i+1;j<n;j++) dist[i][j]=dist[j][i]=INF;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&d);
dist[a][b]=dist[b][a]=d;
}
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dist[i][j]=MIN(dist[i][j],dist[i][k]+dist[k][j]);
for(i=0;i<n;i++)
for(j=1;j<n;j++) dist[i][0]=MAX(dist[i][0],dist[i][j]);
ans=dist[0][0];
for(i=1;i<n;i++) ans=MIN(ans,dist[i][0]);
if(ans==INF) printf("Can not\n");
else printf("%d\n",ans);
}
return 0;
}