C语言并查集的非递归实现详解

 更新时间:2021年09月07日 11:30:28   作者:hnjzsyjyj  
以下是对C语言并查集的递归实现与非递归实现代码进行了详细的介绍,需要的朋友可以过来参考下,希望能够给你带来帮助

【算法分析】

经典的递归实现的并查集,在数据规模过大时,可能会爆栈,因此有了并查集的非递归实现。核心代码如下:

int find(int x) {
	int t=x;
	while(t!=pre[t]) t=pre[t];
	while(x!=pre[x]) {
		x=pre[x];
		pre[x]=t;
	}
	return t;
}
void merge(int x,int y) {
	if(find(x)!=find(y)) pre[find(x)]=find(y);
}

【算法代码】

对问题 http://acm.hdu.edu.cn/showproblem.php?pid=1213 利用非递归实现的并查集的代码如下:

#include <iostream>
using namespace std;
const int maxn=1005;
int pre[maxn];
//int find(int x) {
//	if(x!=pre[x]) pre[x]=find(pre[x]);
//	return pre[x];
//}
int find(int x) {
	int t=x;
	while(t!=pre[t]) t=pre[t];
	while(x!=pre[x]) {
		x=pre[x];
		pre[x]=t;
	}
	return t;
}
void merge(int x,int y) {
	if(find(x)!=find(y)) pre[find(x)]=find(y);
}
int main() {
	int T,N,M;
	int p,q;
	scanf("%d",&T);
	while(T--) {
		int ans=0;
		scanf("%d%d",&N,&M);
		for(int i=1; i<=N; i++) pre[i]=i;
		for(int i=1; i<=M; i++) {
			scanf("%d%d",&p,&q);
			merge(p,q);
		}
		for(int i=1; i<=N; i++) {
			if(find(i)==i) ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
}


/*
in:
2
5 3
1 2
2 3
4 5
5 1
2 5
out:
2
4
*/

并查集压缩路径非递归写法

int find(int x){
    int temp=x;
    while(temp!=d[temp])
        temp=d[temp];
    while(x!=d[x]){
        x=d[x];
        d[x]=temp;
    }
    return temp;
}

参考文章

//www.jb51.net/article/222108.htm

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++ 基础教程之虚函数实例代码详解

    C++ 基础教程之虚函数实例代码详解

    虚函数在 c++ 的继承体系中是一个非常重要概念,让我们可以在子类中复写父类的方法。这篇文章主要介绍了C++ 基础教程之虚函数实例代码的相关资料,需要的朋友可以参考下
    2020-02-02
  • C++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)

    C++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)

    这篇文章主要给大家介绍了关于C++11运算符重载和向量类重载的相关资料,主要包括<<,>>,+,-,*等,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • C语言冒泡排序算实现代码

    C语言冒泡排序算实现代码

    本文主要介绍C语言冒泡排序算法,这里给大家举例说明冒泡排序的思想,并附有代码示例,有需要的小伙伴可以参考下
    2016-07-07
  • C语言实现简易井字棋游戏

    C语言实现简易井字棋游戏

    这篇文章主要为大家详细介绍了C语言实现简易井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 基于C语言模拟实现人生重开模拟器游戏

    基于C语言模拟实现人生重开模拟器游戏

    人生重开模拟器是前段时间非常火的一个小游戏,所以本文我们将一起学习使用c语言写一个简易版的人生重开模拟器,感兴趣的小伙伴可以了解下
    2024-02-02
  • 实例讲解C语言编程中的结构体对齐

    实例讲解C语言编程中的结构体对齐

    这篇文章主要介绍了C语言编程中的结构体对齐,值得注意的是一些结构体对齐的例子在不同编译器下结果可能会不同,需要的朋友可以参考下
    2016-04-04
  • C++实现简单24点游戏

    C++实现简单24点游戏

    这篇文章主要为大家详细介绍了C++实现简单24点游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C/C++实现的MD5哈希校验的示例代码

    C/C++实现的MD5哈希校验的示例代码

    MD5算法是一种广泛使用的 Hash 算法,常用于确保信息传输的完整性与一致性,本文主要介绍了C/C++实现的MD5哈希校验的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • C++实现播放音频的示例详解

    C++实现播放音频的示例详解

    这篇文章主要为大家详细介绍了C++如何利用第三方库实现播放音频的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C++设计模式之简单工厂模式的实现示例

    C++设计模式之简单工厂模式的实现示例

    这篇文章主要给大家介绍了关于C++设计模式之简单工厂模式的相关资料,简单工厂模式,主要用于创建对象,添加类时,不会影响以前的系统代码,需要的朋友可以参考下
    2021-06-06

最新评论