浙江大学机试——欧拉回路

版权声明:转载请注明出处 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;
}

猜你喜欢

转载自blog.csdn.net/FGY_u/article/details/84618846