标签:
#include <stdio.h> #include <string.h> #include <stack> using namespace std; int g[111][111]; int cnt[111]; stack<int> st; int n,m; //搜索求欧拉回路或欧拉通路 void dfs(int u, int t) { st.push(u); int k = 0; for(int i=n; i>=t; --i) { if(g[u][i]>0) { k = 1; g[u][i] = g[i][u] = 0; dfs(i,1); break; } } if(k==0)//如果是桥,说明要回溯 { st.pop(); int x = st.top(); g[u][x] = g[x][u] = 1; int a = u + 1;//下一条边继续搜索 if(st.size()!=m) { st.pop(); dfs(u,a); } else//如果结点数==边数,则表明搜索的结果刚好是回路或者通路 st.push(u); } } int main() { int i,u,v; scanf("%d%d",&n,&m); for(i=0; i<m; ++i) { scanf("%d%d",&u,&v); g[u][v] = g[v][u] = 1; cnt[u]++; cnt[v]++; } bool flag = true; for(i=1; i<=n; ++i) if(cnt[i]%2==1) flag = false; if(flag) { puts("YES"); dfs(1,1); printf("%d",st.top()); st.pop(); while(!st.empty()) { printf(" %d",st.top()); st.pop(); } puts(""); } else puts("NO"); return 0; }
标签:
原文地址:http://www.cnblogs.com/justPassBy/p/4340537.html