`
shinepengwei
  • 浏览: 45798 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

union-find树结构代码

阅读更多

union-find树结构代码,考虑路径压缩和秩启发式规则。

直接上源代码:

#include <stdio.h>
#include <malloc.h>
typedef struct Node
{
	int name;//节点名
	//int count;//以此节点为根的子节点数量
	int father;//父亲节点
	int rank;//秩
}TreeNode, *BiTree;
BiTree initializeNode(int num)
{
	BiTree tn=(BiTree)malloc(num*sizeof(TreeNode));
	for (int i=0;i<num;i++)
	{
		tn[i].name=i;
		//tn[i].count=1;
		tn[i].father=i;//父节点为自己
		tn[i].rank=0;
	}
	return tn;
}

/************************************************************************
找到某个节点的根节点
输入参数:
	root 根据节点名找到节点编号
	tn:根据节点编号查询其父节点
	name:节点名
输出参数:
	index:根结点节点编号
************************************************************************/
int find(int *root,BiTree tn,int name){
	int index=root[name];
	BiTree t=&tn[index];
	if (t->father!=index)
	{
		t->father=find(root,tn,tn[t->father].name);
	}
	return t->father;
}
//两个根结点合并
void f_union(int *root,BiTree  bt,int name1,int name2,int re_name){
	int index1=find(root,bt,name1);
	int index2=find(root,bt,name2);
	BiTree t1=&bt[index1];
	BiTree t2=&bt[index2];
	if (t1->rank>=t2->rank){
		//如果T1的秩大,即T1的树高度高
		t2->father=index1;
		if (t1->rank==t2->rank){
			t1->rank++;
		}
		if (re_name>=0)
		{
			t1->name=re_name;
			root[re_name]=index1;
		}
	}
	else{
		t1->father=index2;
		if (re_name>=0)
		{
			t2->name=re_name;
			root[re_name]=index2;
		}
	}
}
void n_union(int *root,BiTree  bt,int name1,int name2){
	f_union(root,bt,name1,name2,-1);
}
void main()
{
	int num=6;
	BiTree tn=initializeNode(num); 
	int root[11]={-1};
	for (int i=0;i<num;i++)
	{
		root[i]=i;
	}
	n_union(root,tn,1,2);
	n_union(root,tn,3,4);
	n_union(root,tn,4,5);
	n_union(root,tn,4,2);
	n_union(root,tn,2,0);


	for (int i=0;i<num;i++)
	{
		printf("index:%d, ",i);
		printf("name:%d, ",tn[i].name);
		printf("rank:%d, ",tn[i].rank);
		printf("father:%d\n",tn[i].father);
	}
	printf("root[name]:index\n");
	for (int i=0;i<12;i++)
	{
		printf("root[%d]:%d\n",i,root[i]);
	}
	printf("\nprint end");
	char ch = getchar();
}
 
1
4
分享到:
评论

相关推荐

    基于Union-Find的Kruskal算法C++实现

    - `class UnionFind`:自定义的并查集类,包括 `find()`(查找顶点所属集合的根节点)和 `unionSet()`(合并两个集合)等方法。 - `void kruskalMST()`:Kruskal算法的主要函数,进行上述步骤。 在代码设计和变量...

    UnionFind-2x2.pdf

    3. Link-by-Rank:每个集合使用一个树形结构来存储元素,FIND操作时间复杂度为O(log n),UNION操作时间复杂度为O(log n)。 4. Path Compression:在FIND操作中,对路径进行压缩,以减少FIND操作的时间复杂度。 5. ...

    数据结构--并查集(Union-Find Sets)

    并查集(Union-Find Sets)是数据结构中一种用于管理元素集合的高效算法,它主要处理两个操作:连接(union)与查找(find)。在并查集中,元素被分到不同的集合中,每个集合代表一个独立的组件。连接操作将两个元素...

    前端大厂最新面试题-union-find.docx

    并查集(Union-Find)是一种在图论和算法设计中常见的数据结构,主要用于处理一些不相交集合的合并与查询问题。它在前端开发面试中也是一个重要的考察点,因为并查集可以解决许多实际场景中的问题,如网络连接、社交...

    并查集(Union-Find)介绍.zip

    并查集(Union-Find)是一种用于处理连接关系的数据结构,它在计算机科学中有着广泛的应用,尤其是在图论、算法设计以及数据结构的学习中。这个数据结构的主要目标是高效地解决“查找”和“合并”两个操作,常用于...

    实验一:渗透问题(Percolation)1

    1. **合并-查找(Union-Find)数据结构**:这是解决渗透问题的关键。在这个问题中,我们有一个n*n的网格,每个点可以是Open或Closed状态。当最底部的点与最顶端的点连通时,我们认为系统是渗透的。使用并查集可以...

    西安电子科技大学网络与继续教育学院数据结构与算法全真试题

    2. **树形结构**:如二叉树、二叉搜索树、平衡树(AVL树、红黑树)、堆(优先队列)等。试题可能包含对树的遍历(前序、中序、后序)、查找、插入和删除操作的实现和分析。 3. **图论基础**:包括图的表示(邻接...

    Disjoint-Sets-using-Union-Find:使用联合查找和树进行路径压缩的不相交集

    不相交集(Disjoint Sets)是一种数据结构,用于维护一组元素,这些元素可以被分成多个...通过阅读和理解`Disjoint-Sets-using-Union-Find-main`代码,可以深入学习不相交集的原理以及Java中如何高效实现这一数据结构。

    研究生计算机算法上机作业

    4. Kruskal's算法和Prim's算法:这两种是最小生成树算法,用于构建连接所有顶点的树,使得树的总边权重尽可能小。Kruskal's算法基于边的选择,而Prim's算法基于顶点的添加。 5. Ford-Fulkerson算法:解决网络流问题...

    Union-find:算法联合查找 (L3)

    - **树结构**:集合内的节点通过边连接,形成一棵树,根节点为树的顶部。 - **路径压缩**:一种优化技巧,通过直接链接子节点到父节点的祖先,减少查找路径长度。 ### 2. `find` 操作 `find` 操作用于确定一个元素...

    最小生成树Kruskal和Prim算法讨论 (2).docx

    从给定的代码中可以看到,Kruskal算法的实现方式是使用了union-find数据结构来存储图中的顶点信息,并使用排序算法来对边进行排序,然后不断地选择权值最小的边。Prim算法的实现方式是使用了数组来存储图中的顶点...

    AmortizedAnalysis.pdf

    数据结构和算法设计 在算法设计中,数据结构扮演着...这篇lecture slides涵盖了数据结构和算法设计的多个方面,包括静态问题、动态问题、算法和数据结构、Amortized Analysis、Union-Find数据结构和Appetizer问题。

    UnionFind算法

    **UnionFind算法**,也称为并查集算法,是一种用于解决动态连通性问题的数据结构。该算法主要用于判断图中的两个节点是否属于同一个连通分量,并且可以高效地合并不同的连通分量。UnionFind算法在多种场景下都有广泛...

    算法-树形结构- 并查集.rar

    这个压缩包“算法-树形结构- 并查集.rar”包含了关于并查集的详细讲解,主要文件是“树形结构- 并查集.pdf”。以下是对并查集这一概念的详细介绍: 并查集的主要操作包括两个:**查找(Find)** 和 **合并(Union)...

    算法-树形结构- 并查集- 基本操作.rar

    在“树形结构- 并查集- 基本操作.pdf”文档中,可能会详细介绍这些操作的实现细节,包括伪代码和示例,以及可能涉及的优化技巧,如路径压缩和按秩合并的实现。此外,还可能包含了各种问题的实例分析和解题策略,帮助...

Global site tag (gtag.js) - Google Analytics