传递消息,每个人可以传的人不同,时间不同,求传到所有人用时最短的是谁,如果有人是孤立的,输出disjoint
找最长路那段思维比较奇特
#include<stdio.h>
#include<cstring>
int main()
{
int n,a,b,c;
int map[200][200];
int INF=50;
while(scanf("%d",&n)&&n)
{
memset(map,INF,sizeof(map));
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
for(int j=1;j<=a;j++)
{
scanf("%d %d",&b,&c);
map[i][b]=c;
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&map[i][j]>map[i][k]+map[k][j])
{
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
int min=INF,max;
int flage;
for(int i=1;i<=n;i++) //以i为源点寻找i-j的最长路
{
max=0;
for(int j=1;j<=n;j++)
{
if(i!=j&&map[i][j]>max)
max=map[i][j];
}
if(min>max) //记录下来
{
min=max;
flage=i;
}
}
if(min<INF) //如果有孤点的话,其它点到他的距离就是INF,上面寻找最长路,找到的就是INF,最终记录下来的就是INF
{ //还不清楚的话拿题目第一组数据试一下,加一个孤点4,找一遍最长路,你就明白了
printf("%d %d\n",flage,min);
}
else
printf("disjoint\n");
}
return 0;
}