nyoj42 一笔画问题 (欧拉回路)

一笔画问题

时间限制:3000 ms  |  内存限制:65535 KB

难度:4

描述

zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。

规定,所有的边都只能画一次,不能重复画。

输入
第一行只有一个正整数N(N<=10)表示测试数据的组数。

每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)

随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。

输出
如果存在符合条件的连线,则输出"Yes",

如果不存在符合条件的连线,输出"No"。

样例输入
2
4 3
1 2
1 3
1 4
4 5
1 2
2 3
1 3
1 4
3 4
样例输出
No
Yes
来源
[张云聪]原创
上传者
张云聪

#include <stdio.h>
#include <string.h>
int flag,fa[1005],n,rank[1005];
int find(int x)//查找并压缩路径
{
	if(fa[x]!=x) fa[x]=find(fa[x]);
	return fa[x];
}
void uni(int x,int y)//树的层数
{
	if(rank[x]>=rank[y])
	{
		fa[y]=x;
		rank[x]++;
	}
	else
	{
		rank[y]++;
		fa[x]=y;
	}

}
int main()
{
	int ncase,num[1005],v;
	scanf("%d",&ncase);
	while(ncase--)
	{
		memset(fa,0,sizeof(fa));
		memset(rank,0,sizeof(rank));
		memset(num,0,sizeof(num));
		scanf("%d %d",&n,&v);
		for(int i=1;i<=n;i++)
		fa[i]=i,rank[i]=0;
		for(int i=0;i<v;i++)
		{
			int a,b,x,y;
			scanf("%d %d",&a,&b);
			num[a]++,num[b]++;
			x=find(a),y=find(b);
			if(x!=y)
			uni(x,y);
		}
		int odd=0,sum=0;
		for(int i=1;i<=n;i++)
		{
			if(num[i]%2)
			odd++;
			if(fa[i]==i)
			sum++;
		}
		if(odd==0||odd==2&&sum==1)//odd=2时不是一个环,odd=2是个环,sum=1只有一个根
		printf("Yes\n");
		else
		printf("No\n");
	}
	return 0;
}                

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 06:55:19

nyoj42 一笔画问题 (欧拉回路)的相关文章

NYOJ42 一笔画问题 【欧拉回路】+【并查集】

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数. 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<

nyist 42 一笔画 (欧拉回路 + 并查集)

nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路径但不具有欧拉回路的图称为半欧拉图. 先说一下欧拉路径.欧拉回路的充要条件: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数): 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点: 3.有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度

nyoj42 一笔画问题

题目链接 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径.若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路径但不具有欧拉回路的图称为半欧拉图. 先说一下欧拉路径.欧拉回路的充要条件: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数): 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点: 3.有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度 4.有

Nyoj42 一笔画问题 (欧拉道路)

http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring> #define CLR(arr) memset(arr,0,sizeof(arr)) #define P 1001 int G[P],fa[P]; int find(int x){return x==fa[x]?x:x=find(fa[x]);} int main() {     int n,a,b

nyoj42一笔画问题(欧拉图)

这题其实说不上难度4,只是一个简单的欧拉图判断,给一些点,首先判断连通性.如果不连通,就谈不上是欧拉图. 如果是连通的,在判断度的数目,每个顶点都是偶数个或者只有两个是奇数个.这样就可以构成欧拉图. 一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的

Fleury 欧拉回路

基本概念 (1)定义 欧拉通路 (欧拉迹)—通过图中每条边一次且仅一次,并且过每一顶点的通路. 欧拉回路 (欧拉闭迹)—通过图中每条边一次且仅一次,并且过每一顶点的回路. 欧拉图—存在欧拉回路的图.欧拉图就是从一顶出发每条边恰通过一次又能回到出发顶点的那种图,即不重复的行遍所有的边再回到出发点. 通路和回路-称vie1e2…envj为一条从 vi到 vj且长度为n的通路,其中长度是指通路中边的条数.称起点和终点相同的通路为一条回路. 简单图-不含平行边和自回路的图. 混合图-既有有向边,也有无向

欧拉回路与欧拉路 之 一笔画问题

一笔画问题 如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路. 我们定义奇点是指跟这个点相连的边数目有奇数个的点.对于能够一笔画的图,我们有以下两个定理. 定理1:存在欧拉路的条件:图是连通的,有且只有2个奇点. 定理2:存在欧拉回路的条件:图是连通的,有0个奇点. 两个定理的正确性是显而易见的,既然每条边都要经过一次,那么对于欧拉路,除了起点和终点外,每个点如果进入了一次,显然一定要出去一次,显然是偶点.对于欧拉回路,每个点进入和出去次数一定都是相等的

数据结构:图论:欧拉回路!一笔画问题

从无向图中的一个结点出发走出一条道路,每条边恰好经过一次.这样的路线称为欧拉道路. 奇点的概念:一个点的度数为奇数的时候,这个点就称为:奇点. 无向图中结论: 不难发现,在欧拉道路中,除了起点跟终点,其他所有点的度数都应该是偶数! 如果一个无向图是连通的,且最多只有两个奇点,则一定存在欧拉道路. 如果有两个奇点,则必须从其中一个出发,然后从另外一个终止. 如果不存在奇点,则可以从任意点出发,最终一定会回到原点(这样的欧拉道路又称为欧拉回路). 有向图中结论: 前提:在忽略边的方向后,图必须是连通

欧拉回路解决一笔画问题

                       一笔画问题 一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数. 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号