• UVa 208


    题意

    给出一个无向图和终点的编号
    按字典序枚举出从1到终点的路径

    思路

    要事先判断结点1是否可以到达结点k, 用一个bool judge()函数判断一下从终点能否回到1点即可. 如果无解直接输出有0种走法
    有解则用dfs即可. 因为每种走法里一个编号只能走一次, 用一个数组m[]标记是否走过. 记得每次标记之后进入dfs(), 出来之后要清除该标记, 以防影响程序后面的判断
    DFS在回溯时要取消原先的标记
    而BFS不存在回溯也就不存在取消标记这一问题。

    话说这道题的格式, 是没有前导空格的
    VJ给的PDF显示有点问题 =_=

    AC代码

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    #define mst(a) memset(a,0,sizeof(a));
    const int maxn = 30;
    int G[maxn][maxn], vis[maxn][maxn], m[maxn], r[maxn];
    int aim, mmax, all;
    
    bool judge(int n)
    {
        if( n == 1 )    return true;
        m[n] = 1;
        for( int i = mmax; i >= 1; i-- ){
            if( m[i] )    continue;
            if( G[n][i] )
                if( judge(i) )
                    return true;
        }
        return false;
    }
    
    void print( int len )
    {
        all++;
        printf("1");
        for( int i = 0; i < len; i++ )
            printf(" %d",r[i]);
        puts("");
    }
    
    void dfs( int n, int k )
    {
        if( n == aim )
            print(k);
        for( int i = 2; i <= mmax; i++ ){
            if( !m[i] && G[n][i] ){
                m[i] = 1;
                r[k] = i;
                dfs(i, k+1);
                m[i] = 0;
            }
        }
    }
    
    void solve()
    {
        mst(m);
        dfs(1, 0);
    }
    
    int main()
    {
        int a, b, kase = 0;
        while( ~scanf("%d",&aim) ){
            mmax = aim, all = 0;
            mst(G);
            mst(vis);
            mst(m);
            mst(r);
            while( scanf("%d%d",&a,&b) == 2 && a ){
                G[a][b] = 1;
                G[b][a] = 1;    //双向可走
                mmax = max(mmax,a);
                mmax = max(mmax,b);
            }
            printf("CASE %d:
    ",++kase);
            if(!judge(aim)){
                printf("There are 0 routes from the firestation to streetcorner %d.
    ",aim);
                continue;
            }
            solve();
            printf("There are %d routes from the firestation to streetcorner %d.
    ",all, aim);
        }
        return 0;
    }
  • 相关阅读:
    ubuntu英文环境下使用中文输入法
    Flex 调用添加了SoapHeader的web service
    RoR: Ruby On Rails Web Service 3 分发模式
    C# CRC8实现
    java正则表达式过滤html标签
    静态内部类和非静态内部类的区别
    Java反射机制
    java回调函数简介
    Java之泛型编程
    Java基础知识之系统命令调用、序列化、JDO、匿名内部类
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740591.html
Copyright © 2020-2023  润新知