首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【杭电oj】1878 - 欧拉回路(欧拉回路,并查集)

【杭电oj】1878 - 欧拉回路(欧拉回路,并查集)

作者头像
FishWang
发布2025-08-26 18:08:49
发布2025-08-26 18:08:49
11400
代码可运行
举报
运行总次数:0
代码可运行

欧拉回路

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11811 Accepted Submission(s): 4345

Problem Description

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

Input

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结 束。

Output

每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。

Sample Input

代码语言:javascript
代码运行次数:0
运行
复制
   3 3
1 2
1 3
2 3
3 2
1 2
2 3
0

Sample Output

代码语言:javascript
代码运行次数:0
运行
复制
   1
0

Author

ZJU

Source

浙大计算机研究生复试上机考试-2008年

不算太难,懂得欧拉回路成立的条件就行了。

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
#include <cstdio>
#include <algorithm>
using namespace std;
int f[1111];
int find(int x)
{
	if (x != f[x])
		f[x] = find (f[x]);
	return f[x];
}
void join (int x,int y)
{
	int fx,fy;
	fx = find (x);
	fy = find (y);
	if (fx != fy)
		f[fx] = fy;
}
int main()
{
	int n,m;
	int num[1111];
	int root;		//根的数量 
	while (~scanf ("%d",&n) && n)
	{
		scanf ("%d",&m);
		for (int i = 1 ; i <= n ; i++)
		{
			f[i] = i;
			num[i] = 0;
		}
		root = 0;
		while (m--)
		{
			int x,y;
			scanf ("%d %d",&x,&y);
			join(x,y);
			num[x]++;
			num[y]++;
		}
		bool flag = true;
		for (int i = 1 ; i <= n ; i++)
		{
			if (f[i] == i)
				root++;
			if (root > 1 || (num[i] & 1))
			{
				flag = false;
				break;
			}
		}
		if (flag)
			printf ("1\n");
		else
			printf ("0\n");
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 欧拉回路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档