poj1703 Find them, Catch them

这篇博客探讨了如何使用带关系的并查集解决POJ1703问题,即在给定两个罪犯时判断他们是否属于同一帮派。作者通过非递归版本的并查集实现来处理消息,但在实践中遇到了超时问题。文章提供样例输入和输出,并分享了代码清单,希望得到读者的帮助理解超时原因。
摘要由CSDN通过智能技术生成

补记:

关于非递归版本为何会超时,今天早晨就有了答案。请教同学之后,了解到真正的原因:STL对于算法练习的代码而言,还是太慢了(说STL效率高是在实际工程中,使用STL一般不会拖后腿)。改用数组模拟栈就不超时了,耗时比递归稍微少一些,可以忽略不计(看来理论上说得通的东西实际中总体还是不会错的)。

//非递归版本的find函数。递归版本忘记怎么写了,就写一个非递归版本。
//事实上find就做了一件事:
//1.如果x==p[x],返回x的值
//2.否则,从叶子结点x出发一路向上直到找到树根,并把沿途经过的所有结点(包括x)都指向树根,即参照案件都设置为树根上面的案件,并更新关系。
int myFind(int x)
{
	if(x==p[x]) return x;

	int wp=x;	//wp means waypoints
	int ind=-1;	//栈空时候的指针位置

	while (wp!=p[wp])
	{
		wpstack[++ind]=wp;//wpstack是用于模拟栈的全局数组
		wp=p[wp];
	}	//此while结束后wp就是始祖了

	int cf=wp;	//cf means current father
	int cn;	//cn means current node
	while (ind!=-1)
	{
		cn=wpstack[ind--];
		p[cn]=wp;	//把沿途所有结点指向始祖wp
		r[cn]=(r[cn]+r[cf])%2;	//更新与始祖wp的关系
		cf=cn;	//更新当前父结点
	}

	return wp;
}

这是题目:

3:Find

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值