哈密顿绕行世界问题 HDU2181
Posted accepting
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈密顿绕行世界问题 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)
以上是关于哈密顿绕行世界问题 HDU2181的主要内容,如果未能解决你的问题,请参考以下文章