hdu 2181 哈密顿绕世界(dfs+回溯)

来源:互联网 发布:银行服务排名 知乎 编辑:程序博客网 时间:2024/05/18 13:23

点击打开链接

#include <iostream>#include <algorithm>#include <cstring> using namespace std;const int N=30;int g[N][5],m,cnt=0;int vis[N],path[N];void print(){printf("%d:  ",cnt);for(int i=1;i<=21;i++){printf("%d",path[i]);if(i==21)printf("\n");elseprintf(" ");}}void dfs(int cur,int num){path[num]=cur;if(num==21){cnt++;print(); return;}vis[cur]=1;for(int k=1;k<=3;k++){if((num!=20&&!vis[g[cur][k]])||(g[cur][k]==m&&num==20)) {dfs(g[cur][k],num+1);if(g[cur][k]!=m)//起点vis[m]不清0vis[g[cur][k]]=0;//该点为cur的情况讨论完毕,回溯}}}int main(){for(int i=1;i<=20;i++){for(int j=1;j<=3;j++){scanf("%d",&g[i][j]);//g[i][j]和i相连的城市 }}while(cin>>m&&m){cnt=0;memset(vis,0,sizeof(vis)); vis[m]=1; dfs(m,1);//从m出发&&回到m }return 0;} 


0 0
原创粉丝点击