1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <cstring> #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; const int maxn = 110; const int inf = 9999999; int n,m,tot; int g[maxn][maxn],dis[maxn][maxn]; int pre[maxn][maxn],path[maxn];
int main() { cin >> n >> m; for (int i=1; i<=n; ++i) for (int j=1; j<=n; ++j) { g[i][j] = dis[i][j] = inf; pre[i][j] = i; } for (int i=1; i<=m; ++i) { int u,v,w; cin >> u >> v >> w; g[u][v] = g[v][u]= dis[u][v] = dis[v][u] = min(g[u][v],w); } int ans = inf; for (int k=1; k<=n; ++k) { for (int i=1; i<k; ++i) for (int j=i+1;j<k; ++j) { int temp = dis[i][j] + g[i][k] + g[k][j]; if (temp < ans) { ans = temp; tot = 0; int p = j; while (p != i) { path[tot++] = p; p = pre[i][p]; } path[tot++] = i; path[tot++] = k; } }
for (int i=1; i<=n; ++i) for (int j=1; j<=n; ++j) if (dis[i][j] > dis[i][k] + dis[k][j]) { dis[i][j] = dis[i][k] + dis[k][j]; pre[i][j] = pre[k][j]; } } if(ans==inf) cout << "No solution." << endl; else { for (int i=0; i<tot; ++i) cout << path[i] << " "; cout << endl; } return 0; }
|