水题,读题时间比coding还久...不过还是要注意Floyd算法里三个循环是以中间节点为基础开始的。
#include<stdio.h>
#include<string.h>
const int INF = 0x3f3f3f3f;
int G[101][101];
int N;//股票经纪人数量
int number, min; //最短时间开始经纪人编号 和 最短时间
//
void Floyd(){
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
for(int k=1;k<=N;k++)
if(G[j][k] > G[j][i] + G[i][k])
G[j][k] = G[j][i] + G[i][k];
min = INF;
int max;
for(int i=1;i<=N;i++){
max = 0;
for(int j=1;j<=N;j++)
if(G[i][j] > max)
max = G[i][j];
if(max < min){
min = max;
number = i;
}
}
if(min >= INF)
number = 0;
}
int main(){
scanf("%d", &N);
while(N){
memset(G, INF, sizeof(G));
for(int i=1;i<=N;i++)
G[i][i] = 0;
for(int i=1;i<=N;i++){
int k, p, time;
scanf("%d", &k); //第i个经纪人的联络人数
for(int j=0;j<k;j++){
scanf("%d%d", &p, &time); //联络人编号和时间
G[i][p] = time;
}
}
Floyd();
if(number)
printf("%d %d\n", number, min);
else
printf("disjoint\n");
scanf("%d", &N);
}
return 0;
}