并查集 Disjoint Set 检查图中是否有环

本文详细介绍了如何利用并查集(Disjoint Set)数据结构来检测图中是否存在环。通过介绍并查集的基本操作,如Find和Union,结合图的遍历,可以高效地判断一个图是否为有向无环图(DAG)或存在环。
摘要由CSDN通过智能技术生成
package 并查集;
import java.util.Scanner;
public class 并查集 {
//英文名字叫Disjoint Set,作用检查一个图是否存在一个环
//将代表父节点的数组parent[],每一个元素的值初始化为-1,代表每一个节点都是根节点,是一棵独立的树。
//rank数组表示树的高度,一开始一棵树只有一个节点则每棵树的高度都初始为0;
//有多少个节点一开始parent数组就有多少个元素,rank数组也就有多少个元素
public static void initialise(int parent[],int []rank) {
	for(int i=0;i<parent.length;i++) {
		parent[i]=-1;
		rank[i]=0;
	}
}
public static int find_root(int x,int[]parent) {
	int x_root=x;
	while(parent[x_root]!=-1) {
		x_root=parent[x_root];
	}
	return x_root;
}
//返回1则表示union successfully 如果返回值为0,则表示x和y原来就在一个树中了,再加上x和y这一条边就会,
//形成一个环则表示union  failed
public static int union_vertices(int x,int y,int []parent,int []rank) {
	int x_root=find_root(x,parent);
	int y_root=find_root(y,parent);
	if(x_root==y_root) {
		return 0;
	}
	else {
		if(rank[x_root]>rank[y_root]) {
			parent[y_root]=x_root;
		}
		else 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值