题解:明显的欧拉回路,先用并查集判断是否连通,然后计算每个结点的度数是否是偶数,最后递归将欧拉回路压栈,最后输出。
#include <stdio.h>
#include <string.h>
const int N = 55;
int G[N][N], du[N], flag;
void init() {
memset(du, 0, sizeof(du));
memset(G, 0, sizeof(G));
flag = 0;
}
void judge1() {
int i;
for (i = 0; i <= 50; i++)
if (du[i] % 2 != 0) {
flag = 1;
}
}
void euler(int u) {
for (int v = 0; v <= 50; v++) {
if (G[u][v]) {
G[u][v]--;
G[v][u]--;
euler(v);
printf("%d %d\n", v, u);
}
}
}
int main() {
int t, n, v1, v2, cases = 1, i;
scanf("%d", &t);
while (t--) {
init();
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d%d", &v1, &v2);
G[v2][v1]++;
G[v1][v2]++;
du[v1]++;
du[v2]++;
}
judge1();
printf("Case #%d\n", cases++);
if (flag)
printf("some beads may be lost\n");
else {
for (i = 0; i <= 50; i++)
if (du[i])
break;
euler(i);
}
if (t)
printf("\n");
}
return 0;
}