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) 编辑 收藏 举报