#include<iostream> #include<fstream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<set> #include<ctype.h> #include<algorithm> #include<string> #define PI acos(-1.0) #define maxn 1000 #define INF 1<<25 #define mem(a, b) memset(a, b, sizeof(a)) typedef long long ll; using namespace std; int g[55][55], n; int f[55]; struct node { int u, v; }; stack<node> s; int find(int x) { if (f[x] != x) f[x] = find(f[x]); return f[x]; } void euler(int u) { for (int v = 1; v <= 50; v++) if (g[u][v]) { g[u][v]--, g[v][u]--; euler(v); node tmp; tmp.u = u, tmp.v = v; s.push(tmp); } } int main () { int t, i, j, cas = 1; cin>>t; while(t--) { cin>>n; mem(g, 0); int u, v; for (i = 1; i <= 50; i++) f[i] = i; int has[55] = {0}, du[55] = {0}, k; for (i = 0; i < n; i++) { scanf("%d%d", &u, &v); g[u][v] ++; g[v][u] ++; has[u]++, has[v]++; du[u]++, du[v]++; f[find(u)] = find(v); k = u; } int sum = 0; for (i = 1; i <= 50; i++) if (has[i] && f[i] == i) sum++; if (cas != 1) puts(""); printf("Case #%d\n", cas++); bool flag = true; for (i = 1; i <= 50; i++) if (du[i] % 2 == 1) flag = false; if (sum != 1 || !flag) puts("some beads may be lost"); else { euler(k); while(!s.empty()) { node tmp = s.top(); s.pop(); printf("%d %d\n", tmp.u, tmp.v); } } } return 0; }
原文:http://blog.csdn.net/sio__five/article/details/18661367