题目大意
题目分析
典型的最短路问题,由于最开始选择的出发点不固定,因此需要求出所有点之间的最短路。采用floyd算法。判断图是否连通,可以通过判断是否从图中所有的点出发都存在无法到达的点来实现:若从图中所有的点出发,都存在无法到达的点,则说明图不连通。
实现(c++)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define INFINITE 1 << 28
int gDist[105][105];
//Floyd算法
void Floyd(int n){
for (int k = 1; k <= n; k++){ //从i到j,中间经过的节点编号不大于k
for (int i = 1; i <= n; i++){ //起点i
for (int j = 1; j <= n; j++){ //终点j
if (gDist[i][j] > gDist[i][k] + gDist[k][j]){
gDist[i][j] = gDist[i][k] + gDist[k][j];
}
}
}
}
}
int main(){
int n;
while (scanf("%d", &n) && n){
int k, v, d;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
gDist[i][j] = INFINITE;
if (i == j)
gDist[i][j] = 0;
}
}
for (int i = 1; i <= n; i++){
scanf("%d", &k);
for (int j = 0; j < k; j++){
scanf("%d %d", &v, &d);
gDist[i][v] = d;
}
}
Floyd(n);
int min_time = INFINITE, min_stockbroker = 0, disjoint_count = 0;
for (int i = 1; i <= n; i++){
int max = 0;
bool disjoint = false;
for (int j = 1; j <= n; j++){
if (gDist[i][j] == INFINITE){ //说明存在点i无法到达的点
disjoint = true;
break;
}
max = max > gDist[i][j] ? max : gDist[i][j];
}
if (disjoint){
disjoint++;
continue;
}
if (min_time > max){
min_time = max;
min_stockbroker = i;
}
}
if (disjoint_count == n) //如果从每个点出发都有无法到达的点,则说明
//图不是连通的
printf("disjoint\n");
else
printf("%d %d\n", min_stockbroker, min_time);
}
return 0;
}