#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