题目链接:https://vjudge.net/problem/UVA-10054
题目意思最终就是求无向图的欧拉路径,存在的话就输出路径。因为珠子可以正反颠倒,所以是无向图。只要能从任意一个点出发,最终能经历其他所有的点回到起始点就OK。题目意思一眼能明白,欧拉回路不会写啊。。
/*
* @Author: SamsonHo
* @Date: 2018-10-15-13.45.45
* @URL:https://vjudge.net/problem/UVA-10054
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e3+10;
int g[55][55],cnt[55],f[55];
int Find(int x)
{
return x == f[x] ? x : f[x] = Find(f[x]);
}
void dfs(int u)
{
for(int v = 1; v <= 50; ++v)
{
if(g[u][v] > 0)
{
--g[u][v];
--g[v][u];
dfs(v);
printf("%d %d\n",v,u);
}
}
}
int main(void)
{
int T,kase = 0;
scanf("%d",&T);
while(T--)
{
memset(g,0,sizeof g);
memset(cnt,0,sizeof cnt);
for(int i = 1; i <= 50; ++i) f[i] = i;
int n,u,v,x,y,t = -1;
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
{
scanf("%d%d",&u,&v);
++g[u][v];++g[v][u];
++cnt[u];++cnt[v];
x = Find(u),y = Find(v);
if(x != y)
f[x] = y;
}
bool flag = true;
for(int i = 1; i <= 50; ++i)
{
if(cnt[i] == 0) continue;
if(cnt[i]%2) //无向图有奇数点就不能构成欧拉回路了
{
flag = false;
break;
}
if(t == -1)
{
t = Find(i);
continue;
}
if(t != Find(i)) //并查集里不相等
{
flag = false;
break;
}
}
if(kase) puts("");
printf("Case #%d\n",++kase);
if(!flag)
{
puts("some beads may be lost");
continue;
}
else
{
for(int i = 1; i <= 50; ++i)
if(cnt[i]) {t = i; break; } //找任意一个节点
dfs(t); //倒序输出
}
}
}