UVa10054 The Necklace,无向图求欧拉回路

来源:互联网 发布:淘宝上的zuzu是正品吗 编辑:程序博客网 时间:2024/06/05 08:08

无向图求欧拉回路:

1、图连通

        2、所有顶点的度数位偶数


随便从一个点开始递归遍历即可求出路径


#include <cstdio>#include <cstring>#include <vector>using namespace std;const int maxcolor = 50;int n, G[maxcolor+1][maxcolor+1], deg[maxcolor+1];struct Edge{int from, to;Edge(int from, int to):from(from), to(to){}};vector<Edge> ans;void euler(int u){for(int v=1; v<=maxcolor; v++) if(G[u][v]){G[u][v]--; G[v][u]--;euler(v);ans.push_back(Edge(u, v));}}int main(){int T;scanf("%d", &T);for(int cas=1; cas<=T; ++cas){scanf("%d", &n);memset(G, 0, sizeof G );memset(deg, 0, sizeof deg );int start = -1;for(int i=0; i<n; ++i){int u, v;scanf("%d%d", &u, &v);G[u][v]++; G[v][u]++;deg[u]++; deg[v]++;start = u;}//无向图的欧拉回路bool solved = true;for(int i=1; i<=maxcolor; ++i)if(deg[i]%2==1) {solved = false; break;}if(solved){ans.clear();euler(start);if(ans.size() !=n || ans[0].to != ans[ans.size()-1].from)solved = false;}printf("Case #%d\n", cas);if(!solved){printf("some beads may be lost\n");}else for(int i=ans.size()-1; i>=0; i--) printf("%d %d\n", ans[i].from, ans[i].to);if(cas<T) printf("\n");}return 0;}



0 0