POJ1125 动态规划求解多源最短路——Floyd算法
目的
计算非负权值有向图任意两点的最短路径,可以处理环的问题
题目分析
http://poj.org/problem?id=1125
典型的多源最短路问题,思想:https://blog.csdn.net/qq_40859951/article/details/83903242
注意求的是“最小的最大”
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
const int MAXN = 105;
const int INF = 0x3f3f3f;
int D[MAXN][MAXN];
int P[MAXN][MAXN];
int main(){
int N;
while(true){
scanf("%d",&N);
if(N==0) break;
memset(D,INF,sizeof(D));
memset(P,-1,sizeof(P));
for(int i = 0;i < MAXN;i++)
D[i][i] = 0;
for(int i = 1;i <= N;i++){
int n;
scanf("%d",&n);
for(int j = 0;j < n;j++){
int v,cost;
scanf("%d%d",&v,&cost);
D[i][v] = cost;
}
}
for(int k = 1;k <= N;k++)
for(int i = 1;i <= N;i++)
for(int j = 1;j <= N;j++)
if(D[i][j] > D[i][k]+D[k][j]){
D[i][j] = D[i][k]+D[k][j];
P[i][j] = k;
}
// for(int i = 1;i <= N;i++){
// for(int j = 1;j <= N;j++)
// printf("%d ",D[i][j]);
// printf("\n");
// }
int minc = INF,minp = -1;
bool flag = false;
for(int i = 1;i <= N;i++){
int maxc = 0;
for(int j = 1;j <= N;j++){
if(D[i][j] > maxc) {
maxc = D[i][j];
}
}
if(maxc == INF){
printf("disjoint\n");
flag = true;
break;
}
if(minc > maxc){
minc = maxc;
minp = i;
}
}
if(!flag)
printf("%d %d\n",minp,minc);
}
return 0;
}
396K,0MS