题意:求谣言传递的最短时间。
分析:floyd,之后找最短时间就可以了
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAX_N 105
#define inf 0x3f3f3f3f
using namespace std;
int n;
int dp[MAX_N][MAX_N];
void warshall_floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
int main(void)
{
while(scanf("%d",&n)==1)
{
if(n==0)
break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
dp[i][j]=0;
else
dp[i][j]=inf;
}
}
for(int i=1;i<=n;i++)
{
int num;
scanf("%d",&num);
while(num--)
{
int a,b;
scanf("%d%d",&a,&b);
dp[i][a]=b;
}
}
warshall_floyd();
int ans=inf;
int s=-1;
bool ok=false;
for(int i=1;i<=n;i++)
{
int r=-1;
int j;
for(j=1;j<=n;j++)
{
r=max(r,dp[i][j]);
}
if(ans>r)
{
ans=r;
s=i;
}
}
if(s!=-1)
printf("%d %d\n",s,ans);
else
printf("disjoint\n");
}
return 0;
}