zoukankan      html  css  js  c++  java
  • UVa 208 Firetruck【回溯】

    题意:给出一个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
    ",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:
    ", ++kase);    
    68           dfs(1,1);    
    69           printf("There are %d routes from the firestation to streetcorner %d.
    ", ans, en);
    70     }
    71     return 0;    
    72 }
    View Code

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

    加油啊---g00000000000

  • 相关阅读:
    Django组件——forms组件
    Django组件——分页器(paginator)
    Django和Ajax
    多表操作
    输入DStream和Receiver详解
    spark中streamingContext的使用详解
    spark与storm的对比
    spark1.5引进内置函数
    spark 分析sql内容再插入到sql表中
    spark之数据源之自动分区推断
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4480098.html
Copyright © 2011-2022 走看看