应用佛洛依德算法,在写三个循环的时候顺序要注意!
Floyd-Warshall算法的原理是动态规划。
设为从到的只以集合中的节点为中间节点的最短路径的长度。
- 若最短路径经过点k,则;
- 若最短路径不经过点k,则。
因此,。
在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。
AC代码如下:#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
int main(){
int maps[110][110];
int dis[110][110];
int row[110];
int N;
while( cin >> N && N ){
memset( maps, 0x3f, sizeof( maps ) );
memset( dis, 0x3f, sizeof( dis ) );
for( int i = 1; i <= N; i++ ){
int temp;
cin >> temp;
int to, length;
for( int j = 0; j < temp; j++ ){
cin >> to >> length;
dis[i][to] = length;
}
}
for( int k = 1; k <= N; k++ ){//注意这个要放在最前面
for( int i = 1; i <= N; i++ ){
for( int j = 1; j <= N; j++ ){
if( i != j && j != k && i != k ){
dis[i][j] = min( dis[i][j], dis[i][k] + dis[k][j] );
}
}
}
}
memset( row, 0, sizeof( row ) );
for( int i = 1; i <= N; i++ ){
for( int j = 1; j <= N; j++ ){
if( i != j ){
row[i] = max( row[i], dis[i][j] );
}
}
}
int ans = 1;
for( int i = 1; i <= N; i++ ){
if( row[i] < row[ans] ){
ans = i;
}
}
if( row[ans] != MAX ){
cout << ans << " " << row[ans] << endl;
}else{
cout << "disjoint" << endl;
}
}
return 0;
}