POJ 1125 Stockbroker Grapevine(求最短路径—Floyd算法)

//Floyd算法——求最短路径 #include<iostream> using namespace std; const int INF = 200000000;//注意Floyd初始值的INF值不能太大,否则后面加法的时候会溢出,应当估计实际最短路长度上限,并将INF设置为比它大一点点即可 int map[101][101],maximum,flag,minimum,n,p,k; int main () { while(cin >> n) { if(n == 0) break; for(int i = 0;i <= 100;i++) for(int j = 0;j <= 100;j++) if(i == j) map[i][j] = 0;//注意初始化由自己出发到自己的距离为0即map[i][i] = 0; else map[i][j] = INF;//初始化 for(int i = 1;i <= n;++i) { cin >> p; if(p == 0) continue; for(int j = 1;j <= p;++j) { cin >> k; cin >> map[i][k]; } }//输入数据 //Floyd算法过程:三个for for(int k = 1;k <= n;k++) for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) map[i][j] = min(map[i][k] + map[k][j],map[i][j]); //搜寻过程,枚举每个结点能与其他所有节点相连通,该结点出发到其他结点的最大值应当是所有节点出发的中的最小值 minimum = INF; for(int i = 1;i <= n;++i) { int ok = 1; maximum = -1; for(int j = 1;j <= n;++j) { if(map[i][j] >= INF) { ok = 0; break; } else { if(map[i][j] > maximum && map[i][j] > 0) maximum = map[i][j]; } } if(maximum < minimum && ok) { flag = i;//标记该结点,即由该节点出发能够与其他所有结点连通 minimum = maximum; } } if(minimum != INF) cout << flag << " " << minimum << endl; else cout << "disjoint" << endl;//若无连通,则输出disjoint } return 0; } 

你可能感兴趣的:(POJ 1125 Stockbroker Grapevine(求最短路径—Floyd算法))