书上的题解是将每个珠子的两半看成节点,建模成一个无向图判断欧拉回路。
判断欧拉回路要求是联通图,每个节点度数为偶数即可,题目意思是联通图,所以判断度数即可,然后DFS逆序输出欧拉路径
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MAXN 60
using namespace std;
int mp[MAXN][MAXN];
int d[MAXN];
int n;
void euler(int u) {
int v;
for( v = 1;v <= 50;v++) {
if(mp[u][v]) {
mp[u][v]--;
mp[v][u]--;
euler(v);
printf("%d %d\n",v,u);
}
}
}
int main() {
int T;
int kase = 1;
scanf("%d",&T);
while(T--) {
if(kase>1) printf("\n");
int temp;
memset(mp,0,sizeof(mp));
memset(d,0,sizeof(d));
scanf("%d",&n);
int a,b;
for(int i = 0;i < n;i++) {
scanf("%d%d",&a,&b);
mp[a][b]++;
mp[b][a]++;
d[a]++;
d[b]++;
temp = a;
}
bool flag = true;
for(int i = 1;i <= 50;i++) {
if(d[i]%2!=0) flag = false;
}
printf("Case #%d\n",kase++);
if(flag == false) {
printf("some beads may be lost\n");
} else {
euler(temp);
}
}
return 0;
}