• 哈密顿绕行世界问题 HDU2181


    题目大意都比较简单,用vector存一下图,然后爆搜就可以了。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e3+7;
    vector<int >ve[100];
    bool mark[N];
    int path[N];
    string s[N];
    int pos=0;
    int m;
    void dfs(int x,int time){
        mark[x]=1;
        path[time]=x;
        if(time==20){
            string s1="";
            for(int i=0;i<ve[x].size();i++) if(ve[x][i]==m){
                for(int j=1;j<=time;j++){
                    s1+=path[j];
                }
                s[pos++]=s1;
                break;
            }
    
            mark[x]=0;
            return ;
        }
        for(int i=0;i<ve[x].size();i++){
            if(mark[ve[x][i]]) continue ;
            dfs(ve[x][i],time+1);
        }
        mark[x]=0;
    }
    int main(){
        for(int i=1;i<=20;i++){
            int x,y,z;
            cin>>x>>y>>z;
            ve[i].push_back(x);
            ve[i].push_back(y);
            ve[i].push_back(z);
        }
    
        while(cin>>m,m){
            dfs(m,1);
            sort(s,s+pos);
            for(int i=1;i<=pos;i++){
                cout<<i<<":  ";
                for(int j=0;j<20;j++){
                    cout<<(int)s[i-1][j]<<" ";
                }
                cout<<m<<endl;
            }
        }
        return 0;
    }

    (反思:以前写关于DFS题的时候,标记回溯那一块老是出错,现在清楚了一点,以前总是喜欢这样标记:,这样是不对的,因为还没到time+1这一层呢,就已经给他标记好了......应该把标记放在开头和结尾,意思是当进入这一层时,就给他标记上,当马上要离开这一层了,把标记去掉。QWQ)

  • 相关阅读:
    进程控制
    文件、目录操作相关函数
    Linux 系统IO函数 复制文件内容
    gdb调试
    makefile的使用
    GCC编译器
    vim命令的使用
    Linux Ubuntu笔记(常用命令)
    博客搬家(CSDN->博客园)
    level 4
  • 原文地址:https://www.cnblogs.com/Accepting/p/12698764.html
Copyright © 2020-2023  润新知