将颜色抽象成点,珠子抽象成边,建图,判欧拉回路并打印,记住欧拉回路的打印需要回溯打印。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n;
int vis[100];
int g[100][100];
int d[100];
int f[100];
pair<int, int> ans[1005];
int nn;
int Find(int x)
{
return f[x] == x ? x : f[x] = Find(f[x]);
}
void dfs(int ii)
{
for(int i = 1; i <= 50; ++i)
if(g[ii][i])
{
--g[ii][i];
--g[i][ii];
dfs(i);
ans[nn].first = i;
ans[nn].second = ii;
++nn;
}
}
int main()
{
int T;
int kase = 0;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(vis, 0, sizeof(vis));
memset(g, 0, sizeof(g));
memset(d, 0, sizeof(d));
for(int i = 1; i <= 50; ++i)
f[i] = i;
for(int i = 0; i < n; ++i)
{
int u, v;
scanf("%d%d", &u, &v);
++g[u][v];
++g[v][u];
++d[u];
++d[v];
vis[u] = vis[v] = 1;
int k1 = Find(u);
int k2 = Find(v);
f[k1] = k2;
}
int k = -1;
bool error = false;
for(int i = 1; i <= 50; ++i)
if(vis[i])
{
int tmp = Find(i);
if(k == -1 || tmp == k)
{
k = tmp;
continue;
}
error = true;
break;
}
if(kase)
printf("\n");
printf("Case #%d\n", ++kase);
if(!error)
{
int sum = 0;
int id;
int st;
for(int i = 1; i <= 50; ++i)
if(vis[i])
{
st = i;
if(d[i] & 1)
{
++sum;
id = i;
}
}
nn = 0;
if(sum != 0)
{
error = true;
}
else
{
dfs(st);
}
if(!error)
{
for(int i = 0; i < nn; ++i)
{
printf("%d %d\n", ans[i].first, ans[i].second);
}
}
}
if(error)
{
printf("some beads may be lost\n");
}
}
}