哈密顿绕行世界问题 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)

原文地址:https://www.cnblogs.com/Accepting/p/12698764.html