欧拉回路
求欧拉回路dfs代码:
#include <cstdio> #include <iostream> using namespace std; int n,m,dis[101],dis_=0,root=0x7fffffff,path[10001],now=0; bool map[101][101],ok=false,if_[101]; void euler(int now,int gra) { path[gra]=now; if(gra==m+1) { ok=true; return ; } for(int i=1;i<=n;i++) { if(map[now][i]) { map[now][i]=false; map[i][now]=false; euler(i,gra+1); if(ok) return; map[now][i]=true; map[i][now]=true; } } } void euler_back(int now,int gra) { path[gra]=now; if(gra==m+1) { if(now==root) ok=true; return ; } for(int i=1;i<=n;i++) { if(map[now][i]&&!if_[i]) { map[now][i]=false; map[i][now]=false; euler_back(i,gra+1); if(ok) return; map[i][now]=true; map[now][i]=true; } } } int main() { scanf("%d%d",&n,&m); int from,to; for(int i=1;i<=m;i++) { scanf("%d%d",&from,&to); map[from][to]=true; map[to][from]=true; dis[from]++,dis[to]++; } for(int i=1;i<=n;i++) { if(dis[i]%2) { root=min(i,root); dis_++; } } if(dis_==2) { if_[root]=true; euler(root,1); if(ok) { cout<<"true 1"<<endl; for(int i=1;i<=m;i++) cout<<path[i]<<' '; } else cout<<"false"<<endl; cout<<endl; } else { if(!dis_) { euler_back(1,1); if(ok) { cout<<"true 2"<<endl; for(int i=1;i<=m;i++) cout<<path[i]<<" "; } else cout<<"false"; cout<<endl; } else { cout<<"false"<<endl; } } return 0; }