ural 1004 Sightseeing Trip

 

floyd求最小环,递归打印路径。

算法:

 

本题AC代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 
 6 const int cov=105;
 7 const int maxn=0xfffffff;
 8 int g[cov][cov],d[cov][cov],m[cov][cov];
 9 int c=0,path[cov];
10 
11 void dfs(int x,int y){
12     if(m[x][y]==-1) return ;
13     dfs(x,m[x][y]);
14     path[++c]=m[x][y];
15     dfs(m[x][y],y);
16 }
17 
18 int main()
19 {
20     int N,M;
21     while(true){
22         scanf("%d",&N);
23         if(N==-1) break;
24         scanf("%d",&M);
25         for(int i=1;i<=N;i++)
26             for(int j=1;j<=N;j++)
27                 g[i][j]=maxn;
28         memset(m,-1,sizeof(m));
29         int x,y,z;
30         for(int i=1;i<=M;i++){
31             scanf("%d %d %d",&x,&y,&z);
32             if(g[x][y]>z)
33                 g[x][y]=g[y][x]=z;
34         }
35         memcpy(d,g,sizeof(g));
36         int min=maxn;
37         for(int k=1;k<=N;k++){
38             for(int i=1;i<k;i++){
39                 for(int j=i+1;j<k;j++)
40                     if(min>d[i][j]+g[i][k]+g[k][j]){
41                         min=d[i][j]+g[i][k]+g[k][j];
42                         path[1]=k;
43                         path[c=2]=i;
44                         dfs(i,j);
45                         path[++c]=j;
46                     }
47             }
48             for(int i=1;i<=N;i++)
49                 for(int j=1;j<=N;j++)
50                     if(d[i][j]>d[i][k]+d[k][j]){
51                         d[i][j]=d[j][i]=d[i][k]+d[k][j];
52                         m[i][j]=m[j][i]=k;
53                     }
54         }
55         if(min==maxn) printf("No solution.\n");
56         else {
57             for(int i=1;i<c;i++)
58                 printf("%d ",path[i]);
59             printf("%d\n",path[c]);
60         }
61     }
62     return 0;
63 }

 

 

 

posted on 2013-02-26 15:04  Acmer_Roney  阅读(251)  评论(0编辑  收藏  举报

导航