貌似很多人看不懂题意,我解释一下一组数据估计就懂了
3 2 2 4 3 5 2 1 2 3 6 2 1 2 2 2表示有3个股票经纪人
第一行表示第一个股票经纪人的联系人,第一个2表示有2个联系人,2 4表示与第二个联系人有联系,传播到第二个联系人需要4(单位(/ □ \)),3 5表示传播到第三个联系人需要5(单位)
下面同上。
由于是同时传播,所以用最短路找某一点与任一点的最短距离的最大值。
如果有孤立点,输出题目要求的disjoint
貌似太久没用floyd,松弛的判断操作写错了= =,于是WA 2次
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxx = 200;
const int INF = 1e7;
int A[maxx][maxx];
int Edge[maxx][maxx];
void Floyd(int n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
A[i][j] = Edge[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
if(j==i||k==i||j==k) continue;
if(A[j][i] + A[i][k] < A[j][k])
A[j][k] = A[j][i] + A[i][k];
}
}
}
}
int main()
{
// freopen("1002.txt","r",stdin);
int n;
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
Edge[i][j] = INF;
for(int i=1;i<=n;i++)
{
int m;
scanf("%d",&m);
for(int j=1;j<=m;j++)
{
int b,w;
scanf("%d %d",&b,&w);
Edge[i][b] = w;
}
}
Floyd(n);
int ans_p = 0;
int ans_t = INF;
for(int i=1;i<=n;i++)
{
int sum = -1;
int peo = i;
for(int j=1;j<=n;j++)
{
if(j==i) continue;
if(A[i][j] > sum)
sum = A[i][j];
}
if(sum<ans_t)
{
ans_t = sum;
ans_p = peo;
}
}
if(ans_t<INF)
printf("%d %d\n",ans_p,ans_t);
else
printf("disjoint\n");
}
return 0;
}