链接:http://poj.org/problem?id=1125
题意:题意是寻找出所有人中每个人联系其他人时间的最大值的最小值。
思路:floyd算法模板题。水过,数据说最长时间不会超过10,我定义的最大是15结果WA了,改成20过了,注意一下就好。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 105
#define INF 20
typedef long long ll;
using namespace std;
int edge[maxn][maxn];
int main()
{
int tot;
while(scanf("%d",&tot))
{
for(int i=1; i<=tot; i++)
{
for(int j=1; j<=tot; j++)
edge[i][j]=INF;
}
if(tot==0)
return 0;
for(int i=1; i<=tot; i++)
{
int tt;
scanf("%d",&tt);
for(int j=1; j<=tt; j++)
{
int x;
scanf("%d",&x);
scanf("%d",&edge[i][x]);
}
}
for(int i=1; i<=tot; i++)
{
for(int j=1; j<=tot; j++)
{
if(edge[j][i]==INF)
continue;
for(int k=1; k<=tot; k++)
{
if(edge[i][k]==INF)
continue;
if(edge[i][k]+edge[j][i]<edge[j][k])
edge[j][k]=edge[i][k]+edge[j][i];
}
}
}
int ans=INF,rec,per=-1;
for(int i=1; i<=tot; i++)
{
rec=0;
for(int j=1; j<=tot; j++)
{
if(i==j)
continue;
if(edge[i][j]>rec)
{
rec=edge[i][j];
}
}
if(rec!=INF&&rec<ans)
{
ans=rec;
per=i;
}
}
if(per==-1)
printf("disjoint\n");
else
printf("%d %d\n",per,ans);
}
}