这道题的题意很难懂,看了别人的博客之后才理解这道题是让干嘛的。这道题就是说:给你N个点,从第一个点开始,与第i个点相连的有m个对,每对中的第一个数代表的是与i点相连的点的编号,第二个点表示i点与这个编号的点相连的权值。从一个点开始可以同时全送一个信息,求从哪个点开始到所有的点接收信息,所花费的时间最小,最小是多少。
这道题还要求判断所给的图是否是连通的,但系统没有判断这一点,个人理解就是先假设每两个点花费的时间无穷大INF,然后从一个点出发,只要判断与该点相连的点中有时间花费为INF的,就知道该点不是连通图,这一点也是很容易的。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x7fffff;
int map[110][110],n;
void Floyd() {
int i,j,k;
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
int main() {
int i,num,time,ans,j;
while(~scanf("%d",&n) && n) {
memset(map,inf,sizeof(map));
for(i=1; i<=n; i++) {
scanf("%d",&num);
while(num--) {
scanf("%d%d",&ans,&time);
map[i][ans]=time;
}
}
Floyd();
int mi=inf;
for(i=1; i<=n;i++) {
time=-1;
for(j=1; j<=n; j++) {
if(i==j) continue;
if(map[i][j]>time) {
time=map[i][j];
}
}
if(mi>time) {
num=i;
mi=time;
}
}
printf("%d %d\n",num,mi);
}
return 0;
}