标签:
5 7 1 4 1 1 3 300 3 1 10 1 2 16 2 3 100 2 5 15 5 3 20 4 3 1 2 10 1 3 20 1 4 30 -1
1 3 5 2 No solution.
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int INF = 0x3f3f3f3f; 4 const int maxn = 110; 5 int n,m,d[maxn][maxn],w[maxn][maxn],fa[maxn][maxn]; 6 vector<int>cycle; 7 int Floyd() { 8 int minCycle = INF; 9 for(int k = 1; k <= n; ++k) { 10 for(int i = 1; i < k; ++i) 11 for(int j = i + 1; j < k && w[i][k] < INF; ++j) { 12 int tmp = d[i][j] + w[i][k] + w[k][j]; 13 if(tmp < minCycle) { 14 minCycle = tmp; 15 cycle.clear(); 16 int p = j; 17 while(p != i) { 18 cycle.push_back(p); 19 p = fa[i][p]; 20 } 21 cycle.push_back(i); 22 cycle.push_back(k); 23 } 24 } 25 for(int i = 1; i <= n; ++i) 26 for(int j = 1; j <= n && d[i][k] < INF; ++j) { 27 int tmp = d[i][k] + d[k][j]; 28 if(tmp < d[i][j]) { 29 d[i][j] = tmp; 30 fa[i][j] = fa[k][j]; 31 } 32 } 33 } 34 return minCycle; 35 } 36 int main() { 37 int u,v,ww; 38 while(~scanf("%d",&n)) { 39 if(n == -1) return 0; 40 scanf("%d",&m); 41 for(int i = 0; i < maxn; ++i) 42 for(int j = 0; j < maxn; ++j) { 43 d[i][j] = w[i][j] = INF; 44 fa[i][j] = i; 45 } 46 while(m--) { 47 scanf("%d%d%d",&u,&v,&ww); 48 ww = min(ww,w[u][v]); 49 w[u][v] = w[v][u] = d[u][v] = d[v][u] = ww; 50 } 51 if(Floyd() == INF) puts("No solution."); 52 else { 53 printf("%d",cycle[0]); 54 for(int i = 1; i < cycle.size(); ++i) 55 printf(" %d",cycle[i]); 56 putchar(‘\n‘); 57 } 58 } 59 return 0; 60 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4714742.html