问题描述:
http://hihocoder.com/contest/hiho24/problem/1
算法描述
floyd 算法可以在O( n3 ) 时间求出所有顶点间的最短路径。
#include <cstdio>
#include <cstring>
#include <algorithm>
//using namespace std;
enum {maxn = 100+5, MINF = 1<<12};
int G[maxn][maxn];
int main()
{
//printf("%d\n", MINF);
// freopen("in.txt", "r", stdin);
int N, M;
scanf("%d %d", &N, &M);
for (int i=0; i<N; i++)
for (int j=0; j< N; j++)
if (i!= j)
G[i][j] = MINF;
else
G[i][j] = 0;
for (int i=0; i<M; i++)
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
a--; b--;
G[a][b] = G[b][a] = std::min(G[b][a], c);
}
for (int k = 0; k<N; k++)
for (int i=0; i< N; i++)
for (int j=0; j< N; j++)
G[i][j] = std::min(G[i][j], G[i][k] + G[k][j]);
for (int i=0; i< N; i++)
{
for (int j=0; j< N; j++)
printf("%d ", G[i][j]);
printf("\n");
}
return 0;
}
需要注意:
1, 最大路径值不能设置太大,要保证2*最大路径值不会溢出。
2, 数据中存在两个节点之间有多条路径,我们应该在输入时选择最小的路径。