1. 程式人生 > >無向圖的最短環(需要輸出路徑)

無向圖的最短環(需要輸出路徑)

names 最小 需要 oid 出現 map ref int 裏的

參考代碼:https://blog.csdn.net/yo_bc/article/details/75042688

POJ-1734

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int MAX = 100+9;
 5 const int _inf = 0x7fffffff; 
 6 const int INF = _inf/3;//可能會出現三個inf相加 
 7 
 8 int n,m;
 9 int dis[MAX][MAX];
10 int map[MAX][MAX];
11 int pre[MAX][MAX],path[MAX];//用於打印路徑 12 13 void init() { 14 for(int i = 1; i <= n; i++) { 15 for(int j = 1; j <= n; j++) { 16 pre[i][j] = i; 17 map[i][j] = dis[i][j] = INF; 18 } 19 map[i][i] = dis[i][i] = 0; 20 }
21 } 22 23 void folyd() { 24 int mins = INF; 25 int tmp; 26 int cnt ,sum; 27 for(int k = 1; k <= n; k++) { 28 for(int i = 1; i < k; i++) { 29 for(int j = i+1; j < k; j++) { 30 tmp = dis[i][j] + map[i][k] + map[k][j]; 31 if
(mins > tmp) { 32 mins = tmp; 33 cnt = 0, sum = 1; 34 //cnt 用於更新路徑path: 因為最短環在改變,所以路徑也會變 35 //sun 用於統計不同最小環的個數(i,j相同時可根據k區分,相同k可根據i,j區分,所以不會重???) 36 int t = i;//註:這裏的環是 j--k--i....j 所以前一個是 i 37 while(t != j) {//遞推找路徑 38 path[cnt++] = t; 39 t = pre[j][t]; 40 } 41 path[cnt++] = j;//t==j 時退出後,前一個是j 42 path[cnt++] = k;//不是很懂這個耶......... 43 } 44 else if(mins == tmp) ++sum;//長度相同只是路徑不同(雖然這題沒用到) 45 } 46 } 47 48 for(int i = 1; i <= n; i++) { 49 for(int j = 1; j <= n; j++) { 50 if(dis[i][j] > dis[i][k] + dis[k][j]) { 51 dis[i][j] = dis[i][k] + dis[k][j]; 52 pre[i][j] = pre[k][j];//更新了最短路,pre自然要更新 53 } 54 55 } 56 } 57 } 58 59 if(mins == INF ) puts("No solution."); 60 else { 61 for(int i = cnt-1; i > 0; --i) printf("%d ",path[i]); 62 printf("%d",path[0]);//格式要對喲 63 } 64 } 65 66 int main() { 67 while(~scanf("%d %d",&n,&m)) { 68 init();//初始化 69 int a,b,c; 70 for(int i = 1; i <= m; i++) { 71 scanf("%d%d%d",&a,&b,&c); 72 map[b][a] = map[a][b] = dis[b][a] = dis[a][b] = min(dis[a][b],c); 73 } 74 folyd(); 75 } 76 return 0; 77 }

無向圖的最短環(需要輸出路徑)