pku1125: http://poj.org/problem?id=1125
题意:群发短信:给出n个群发者,输出的第i行的第一个输出k表示第i个发信息者可以给k个人发短信,接着输出k对数据,每对两个数分别表示被联系者的编号和与其联系时间,问由哪个人群发短信花费的时间最短,转化为最短路问题即为:给出每个点到其他点的距离,求所有点到其他点最长距离的最小值,并输出该起点
解法:floyd求出每个点到各点的最短路,再枚举各点,求出各个最大值,再取最小值
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int v[150][150];
const int inf=1<<29;
int main()
{
int n,k,a,b,max,min,ans;
while(1)
{
scanf("%d",&n);
if(n==0)break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
v[i][j]=0;
else
v[i][j]=inf;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&a,&b);
v[i][a]=b;
}
}
for(int t=1;t<=n;t++) //floyd
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(v[i][j]>v[i][t]+v[t][j])
v[i][j]=v[i][t]+v[t][j];
}
}
}
min=inf;ans=-1;
for(int i=1;i<=n;i++)
{
max=-1;
for(int j=1;j<=n;j++)
{
if(v[i][j]>max)
{
max=v[i][j];
}
}
if(max<min)
{
min=max;ans=i;
}
}
if(ans==-1)
printf("disjoint\n");
else
printf("%d %d\n",ans,min);
}
}
/*input:
3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2
5
3 4 4 2 8 5 3
1 5 8
4 1 6 4 10 2 7 5 2
0
2 2 5 1 5
0
output:
3 2
3 10*/