题目链接:http://poj.org/problem?id=1125
多源点最短路中的,最长路的,最短路。 看到这里就懵逼了,解释一下,找到一个源点,使得路最短,(遍历源点),路最短怎么求呢? 就是找到从该源点出发,到达所有点中的最长的点的路径,就是他的最短路,然后根据n个源点,找到这样的最长路最短的,就行了。
这里的具体Floyd算法,我还没推过,dis[i][j]从I到J的最短路。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f int dis[105][105]; int n; void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]); int minlength = INF; int flag = 0; for(int i=1;i<=n;i++) { int maxlength = 0; for(int j=1;j<=n;j++) { if(i!=j&&dis[i][j]>maxlength) maxlength = dis[i][j]; } if(minlength>maxlength) { minlength = maxlength; flag = i; } } if(flag) printf("%d %d ",flag,minlength); else printf("disjoint "); } int main() { while(scanf("%d",&n),n) { memset(dis,INF,sizeof(dis)); for(int i=1; i<=n; i++) { int pairs; scanf("%d",&pairs); for(int j=1; j<=pairs; j++) { int to,time; scanf("%d%d",&to,&time); dis[i][to] = time; } } floyd(); } return 0; }