题目链接:UVa 10054 The Necklace
对有向图来说,有向图G具有一条单向欧拉回路,当且仅当是连通的,且每个结点入度等于出度。对无向图来说,无向图G具有一条欧拉回路,当且仅当G是连通的,并且所有结点的度数均为偶数。
我还是不明白这个题为什么要逆序输出。。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAX_N = 50 + 10; int G[MAX_N][MAX_N], p[MAX_N], degree[MAX_N]; int _find(int x) { return p[x] == x ? x : (p[x] = _find(p[x])); } void dfs(int u) { for(int v = 0; v < MAX_N; v++) { if(G[u][v]) { G[u][v]--, G[v][u]--; //printf("%d %d\n", u, v); dfs(v); printf("%d %d\n", v, u); } } } int n; int main() { int T, _case = 0; scanf("%d", &T); while(T--) { scanf("%d", &n); int u, v, x, y, _beg, _par; bool flag = true; memset(G, 0, sizeof(G)); memset(degree, 0, sizeof(degree)); for(int i = 0; i < MAX_N; i++) p[i] = i; for(int i = 0; i < n; i++) { scanf("%d%d", &u, &v); G[u][v]++, G[v][u]++; degree[u]++, degree[v]++; x = _find(u); y = _find(v); if(x != y) p[x] = y; } for(int i = 0; i < MAX_N; i++) { if(degree[i]) { _par = _find(i), _beg = i; break; } } for(int i = 0; i < MAX_N; i++) { if(degree[i]) { if(_par != _find(i)) { flag = false; break; } } } if(flag) { for(int i = 0; i < MAX_N; i++) { if(degree[i] % 2 != 0) { flag = false; break; } } } if(_case != 0) printf("\n"); printf("Case #%d\n", ++_case); if(!flag) printf("some beads may be lost\n"); else dfs(_beg); } return 0; }