早上看了看最短路的知识,下午把题读懂后,终于自己搞定了,这让我感觉到,其实学习新知识是可以很快的,只要用心就好。。。。
这道题我是这样考虑的:
1 分别把每个点当做源点;
2对于每个源点,求出从源点到其他各个点的最短路径(当然,如果不能到达每一个其他点,那么以他为源点则不是连通的),这之中最长的即为从此源点传遍其他所有人所用的最短时间
3比较每一个源点所用时间,输出最短的即可;
注:此题的核心部分是第2歩中,求从源点到其他各点的最短路,这也是最短路问题的核心算法(我是这样认为的)。。。。。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 1500
#define STOP system("pause")
int time[102],v[102],w[102][102];
void init()
{
int i,j;
memset(v,0,sizeof(v));
for(i=0;i<102;i++)
{
time[i]=INF;
for(j=0;j<102;j++)
w[i][j]=INF;
}
}
int main()
{
int n,k,v1,i,j;
int min,ok,first,s;
while(scanf("%d",&n)&&n)
{
init();
min=INF;
for(i=1;i<=n;i++)
{
scanf("%d",&k);
for(j=1;j<=k;j++)
{
scanf("%d",&v1);
scanf("%d",&w[i][v1]);
}
}
/* for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",w[i][j]);
printf("\n");
}
STOP;*/
for(int t=1;t<=n;t++)
{
time[t]=0;
s=-1;
ok=1;
for(i=1;i<=n;i++) //这个for循环中是核心代码
{
int x,m=INF;
for(int y=1;y<=n;y++)
if(!v[y]&&time[y]<=m)
m=time[x=y];
v[x]=1;
for(int y=1;y<=n;y++)
if(time[y]>(time[x]+w[x][y]))
time[y]=time[x]+w[x][y];
}
/*
for(i=1;i<=n;i++)
printf("%d ",time[i]);
STOP; */
for(i=1;i<=n;i++)
{
if(time[i]==INF)
{
ok=0;
break;
}
else
{
if(time[i]>s)
s=time[i];
}
}
if(ok)
{
if(s<min)
{
first=t;
min=s;
}
}
memset(v,0,sizeof(v));
for(i=0;i<=n;i++)
time[i]=INF;
}
if(min==INF)
printf("disjoint\n");
else
printf("%d %d\n",first,min);
}
return 0;
}