码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 208 Firetruck【回溯】

时间:2015-05-05 21:41:45      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出一个n个节点的无向图,以及某个节点k,按照字典序从小到大输出从节点1到节点k的所有路径

看的题解

http://blog.csdn.net/hcbbt/article/details/9755147

因为节点数很少(小于20),所以可以先用floyd处理一下,判断一点是否能够到达终点

然后就像紫书里面枚举排列那样的去挨个找出字典序从小到大的路径

题解里面说到的无回溯的走遍和终点相连的所有点,他写的代码是判断的d[en][i],判断终点到i点是否可达

写成d[i][en]也能过,因为是无向图

技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
14 
15 typedef long long LL;
16 const int INF = (1<<30)-1;
17 const int mod=1000000007;
18 const int maxn=55;
19 
20 int d[maxn][maxn],rute[maxn],vis[maxn];
21 int en,n,ans;
22 
23 void dfs(int x,int cnt){
24     if(x==en){
25         printf("1");
26         for(int i=1;i<cnt-1;i++) printf(" %d",rute[i]);
27         printf(" %d\n",en);
28         ans++;
29         return;        
30     }
31     
32     for(int i=2;i<=n;i++){
33         if(!vis[i]&&d[x][i]==1&&d[i][en]!=INF){            

34             rute[cnt]=i;
35             vis[i]=1;
36             dfs(i,cnt+1);
37             vis[i]=0;
38         }
39     }
40 }
41  
42 
43 int main(){
44     int kase=0;
45     while(scanf("%d",&en)!=EOF){
46         int u,v;
47         n=-1;
48         for(int i=1;i<=55;i++){
49             for(int j=1;j<=55;j++) {
50                 d[i][j]=INF;
51             }        
52         }
53              
54         while(scanf("%d %d",&u,&v)&&(u||v)){
55             d[u][v]=d[v][u]=1;
56             n=max(max(u,v),n);//找出这张图里面最大的点的标号                    
57         }
58         
59         for(int k=1;k<=n;k++)
60          for(int i=1;i<=n;i++)
61           for(int j=1;j<=n;j++)
62           d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
63           
64           ans=0;
65           memset(vis,0,sizeof(vis));
66           
67           printf("CASE %d:\n", ++kase);    
68           dfs(1,1);    
69           printf("There are %d routes from the firestation to streetcorner %d.\n", ans, en);
70     }
71     return 0;    
72 }
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

不知道是不是真的理解了的说啊-----

加油啊---g00000000000

UVa 208 Firetruck【回溯】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4480098.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!