#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define BUG cout << "here\n";
using namespace std;
const int INF = 0x7fffffff;
const int N = 105;
int map[N][N];
int path[N][N];
int n, m;
int s, t;
void output(int i, int j){
if(i == j) return;
if(path[i][j] == -1) {
cout << '-' << j;
}
else {
output(i,path[i][j]);
output(path[i][j],j);
}
}
void solve(int a, int b) {
BUG;
s = a; t = b;
cout << s;
output(s, t);
cout << " : " << map[s][t] << endl;
}
void floyd(int n) {
int i, j, k;
for(k = 1; k <= n; k++) {
for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
if(map[i][k] < INF && map[k][j] < INF && map[i][j] > map[i][k] + map[k][j]) {
map[i][j] = map[i][k] + map[k][j];
path[i][j] = k;
}
}
}
}
}
int main() {
int i, j, a, b, w;
while(cin >> n >> m) {
for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
if(i == j) map[i][j] = 0;
map[i][j] = INF;
}
}
for(i = 1; i <= m; i++) {
cin >> a >> b >> w;
map[a][b] = w;
}
memset(path, -1, sizeof(path));
floyd(n);
solve(1, 2);
}
return 0;
}
/*
测试数据
5 5
1 2 10
1 4 20
1 5 1
3 2 3
5 3 2
*/
/*
1-5-3-2 : 6 (表示 1 -> 2 的最短路径的路径以及值)
*/
Floyd-template 示例
最新推荐文章于 2023-11-21 00:32:41 发布