我们读入的时候,要考虑重边的问题,我们只取边的最小值就可以了。
#include <cstdio>
#include <cstring>
const int INF = 0x3f3f3f3f;
int map[105][105];
int n,m;
int min(int x,int y)
{
return x < y ? x : y;
}
int main()
{
int c, s, e;
scanf("%d%d", &n, &m);
memset(map, INF, sizeof(map));
for (int i = 0; i <= n; i++)
map[i][i] = 0;
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &s, &e, &c);
if (c<map[s][e])
map[s][e] = map[e][s] = c;
}
for (int k = 1; k <= n;k++) {
for (int i = 1; i <= n;i++) {
for (int j = 1; j <= n;j++) {
if (k!=i&&k!=j&&i!=j) {
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j < n; j++) {
printf("%d ", map[i][j]);
}
printf("%d
", map[i][n]);
}
// getchar();
// getchar();
return 0;
}