//题意:判断欧拉回路是否存在
//思路:1、欧拉回路判断条件:所有边的度数为偶数并且能够所有点都可以连起来
// 2、并差集
//思路:1、欧拉回路判断条件:所有边的度数为偶数并且能够所有点都可以连起来
// 2、并差集
#include <iostream>
using namespace std;
//题意:判断欧拉回路是否存在
//思路:1、欧拉回路判断条件:所有边的度数为偶数并且能够所有点都可以连起来
// 2、并差集
#define NSIZ 1100
int parent[NSIZ];
int myrank[NSIZ];
int degree[NSIZ];
void make_set(int n)
{
int i;
memset(degree, 0, sizeof(degree));
for(i = 1;i <= n; ++i)
{
parent[i] = i;
myrank[i] = 1;
}
}
int find_set(int x)
{
if(x != parent[x])
{
parent[x] = find_set(parent[x]);
}
return parent[x];
}
void union_set(int x, int y)
{
x = find_set(x), y = find_set(y);
if(x != y)
{
if(myrank[x] < myrank[y])
{
parent[x] = y;
myrank[y] += myrank[x];
}
else
{
parent[y] = x;
myrank[x] += myrank[y];
}
}
}
int main()
{
int n, m;
int i, x, y, fx, fy;
int isDegreeOk, isOnlyOneParent;
while(scanf("%d", &n) != EOF && n)
{
scanf("%d", &m);
//init
make_set(n);
isDegreeOk = 0;
isOnlyOneParent = 0;
for(i = 1;i <= m; ++i)
{
scanf("%d %d", &x, &y);
degree[x]++;
degree[y]++;
union_set(x, y);
}
for(i = 1;i <= n; ++i)
{
if(degree[i] & 1 == 1) //判断是否是所有的点的度数都为偶数
{
isDegreeOk = 1;
break;
}
if(parent[i] == i) //判断是否是只有一个父节点
{
isOnlyOneParent++;
}
}
if(!isDegreeOk && isOnlyOneParent == 1)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
return 0;
}
本文介绍了一种算法用于判断给定图中是否存在欧拉回路,通过检查图中所有边的度数是否为偶数且每个点都有唯一的父节点来实现。
11万+

被折叠的 条评论
为什么被折叠?



