版权声明:转载请注明出处 https://blog.csdn.net/FGY_u/article/details/84618846
题目: 牛客网链接
概述: 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
思路: 确定无向图欧拉回路的充要条件:除孤立节点外,其它节点满足 1.连通 2.度为偶数。这里采用并查集进行操作,具体思路写在注释里。
#include <iostream>
using namespace std;
int father[1005], cnt[1005]; //这里的fa是用于存储并查集的前驱节点, cnt是存储每个节点的度,开了1005大小
//并查集-查找
int find(int x)
{
while(father[x] != x)
{
x = father[x];
}
return x;
}
//并查集-合并
void union_find(int x, int y)
{
x = find(x);
y = find(y);
father[x] = y;
}
int main()
{
int m, n;
while(scanf("%d", &n) != EOF && n)
{
scanf("%d", &m);
for(int i = 1; i <= n; i++) father[i] = i;
for(int i = 1; i <= m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
cnt[x]++;
cnt[y]++;
union_find(x, y);
}
bool flag = true;
//判断是否有度为1的点,如果有,不符合退出。
for(int i = 1; i <= n; i++)
{
if(cnt[i] % 2 != 0)
flag = false;
}
if(flag == false)
{
printf("%d/n", flag);
break;
}
//非孤立节点的父节点应该都是一个,先来找一个非孤立节点
int t; //用于存储一个非孤立节点
for(int i = 1; i <= n; i++)
{
if(cnt[i] != 0)
{
t = i;
break;
}
}
int fa = find(t);
for(int i = 2;i <= n; i++){
//既不是孤立节点,也不连通,应打印0
if(find(i) != fa && find(i) != i){
flag = false;
break;
}
}
printf("%d\n", flag);
}
return 0;
}