nyoj42 一笔画问题 并查集加欧拉回路

原来想的只是个简单欧拉回路问题 没想到wa了两次 最后才知道还要判定是不是通路的问题, 这就要用到并查集了

并查集:参考网址http://www.nocow.cn/index.php/并查集 简而言之就是将一些点归到尽量少的集合当中去(纯属个人看法,有什么不对的地方欢迎指导);

用了并查集之后,可以通过查询每个点的祖先是不是同样的一个数, 如果是, 那就表明这些点构成了一个回路, 如果不是那就没有构成一个通路;

代码:


/*
描述
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 father[2002], s[2002];
int find( int x )//找到祖先的祖先, 根节点
{
	if( father[x] != x ) father[x] = find(father[x]); //将每一个数对应的祖先都赋给对应的序号内
	return father[x];
} 
int merch( int a, int b )
{
	a = find(a);
	b = find(b);
	if( a!= b ) father[a] = b;
}
int main()
{
	int t, p, q, a, b, i;
	scanf( "%d", &t );
	while( t -- )
	{
		scanf( "%d%d", &p, &q );
		memset( s, 0, sizeof(s) );
		for( i = 1; i <= p; i ++ )
		father[i] = i; //初始化将每一个数的祖先都定义为他自己
		for( i = 0; i < q; i ++ )
		{
			scanf( "%d%d", &a, &b );
			++s[a], ++s[b]; 
			merch( a, b);  
		}
		int flag = 0, ok = 0;
		for( i = 1; i <= p; i ++ )
		{
			if( father[i] == i ) flag++; //如果有自己等于自己的那么他就是一个根节点(原始祖先)
			if( s[i]&1 ) ++ok;
			if( flag >1 ) {
				ok = 3;
				break;
			}
		}
		//for( i = 1; i <= p; i ++ )
		//printf( "%d..", father[i] ); 
		if( flag == 1&&( ok == 0||ok==2 ) )
		printf( "Yes\n" );
		else
		printf( "No\n" );
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
孪生素数是指两个素数之间的差值为2的素数对。通过筛选法可以找出给定素数范围内的所有孪生素数的组数。 在引用的代码中,使用了递归筛选法来解决孪生素数问题。该程序首先使用循环将素数的倍数标记为非素数,然后再遍历素数数组,找出相邻素数之间差值为2的素数对,并统计总数。 具体实现过程如下: 1. 定义一个数组a[N,用来标记数字是否为素数,其中N为素数范围的上限。 2. 初始化数组a,将0和1标记为非素数。 3. 输入要查询的孪生素数的个数n。 4. 循环n次,每次读入一个要查询的素数范围num。 5. 使用两层循环,外层循环从2遍历到num/2,内层循环从i的平方开始,将素数的倍数标记为非素数。 6. 再次循环遍历素数数组,找出相邻素数之间差值为2的素数对,并统计总数。 7. 输出总数。 至此,我们可以使用这个筛选法的程序来解决孪生素数问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python用递归筛选法求N以内的孪生质数(孪生素数)](https://blog.csdn.net/weixin_39734646/article/details/110990629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [NYOJ-26 孪生素数问题](https://blog.csdn.net/memoryofyck/article/details/52059096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值