題目:已知一些珠子,珠子由兩個半圓組成,問這些珠子能否拼成一個鏈子,使得不同珠子相鄰的半圓相同。
分析:圖論、歐拉迴路。直接利用dfs求解即可;歐拉迴路存在的條件,所有點的度為偶數(無向圖)。
說明:老是submit error╮(╯▽╰)╭。
#include <cstdlib>
#include <cstring>
#include <cstdio>
int degree[55];
int G[55][55];
int euler(int v)
{
for (int i = 1; i <= 50; ++ i)
if (G[v][i]) {
G[v][i] --;
G[i][v] --;
euler(i);
printf("%d %d\n",i,v);
}
}
int main()
{
int n, t, u, v;
while (~scanf("%d",&t))
for (int k = 1; k <= t; ++ k) {
scanf("%d",&n);
memset(degree, 0, sizeof(degree));
memset(G, 0, sizeof(G));
for (int i = 0; i < n; ++ i) {
scanf("%d%d",&u,&v);
G[u][v] ++;
G[v][u] ++;
degree[u] ++;
degree[v] ++;
}
int flag = 0;
for (int i = 1; i <= 50; ++ i) {
if (degree[i]%2) {
flag = 1;
break;
}
}
printf("Case #%d\n",k);
if (!flag)
euler(v);
else printf("some beads may be lost\n");
if (k < t) printf("\n");
}
return 0;
}