HDU_1878 欧拉回路
做这题要分两步:
1:先判断每个节点的度是否都为偶数,若都是偶数,则有可能存在欧拉回路,只要出现一个节点的度为奇数,则可以肯定绝对没有欧拉回路
2:若所有节点的度都为偶数,再用并查集判断是不是从任意的节点走都可以走到其他的任意点,若可以则有欧拉回路,若不可以则没有
#include <stdio.h>
#define num 1000
int m, n, i, a, b, flag, du[num], set[num];
void init()
{
for (i = 1; i <= n; ++ i)
{
du[i] = 0;
set[i] = i;
}
flag = 0;
}
int find(int x)
{
int i, j, r = x;
while (r != set[r])
{
r = set[r];
}
i = x;
while (i != r)
{
j = set[i];
set[i] = r;
i = j;
}
return r;
}
void merge(int x, int y)
{
x = find(x);
y = find(y);
if (x < y) set[y] = x;
else set[x] = y;
}
int main()
{
while (scanf("%d", &n) && n)
{
init();
scanf("%d", &m);
while (m --)
{
scanf("%d %d", &a, &b);
merge(a, b);
du[a] ++;
du[b] ++;
}
for (i = 1; i <= n; ++ i)
{
if (du[i] & 1)
{
flag = 1;
break;
}
}
if (!flag)
{
for (i = 2; i <= n; ++ i)
{
if (set[i] != 1)
{
flag = 1;
break;
}
}
}
if (flag) puts("0");
else puts("1");
}
return 0;
}