并查集 JAVA封装并查集类 题目总结 洛谷P1196 [NOI2002]银河英雄传说 洛谷P2024 [NOI2001]食物链 洛谷P1111 修复公路

本文介绍了如何封装并查集类,提供了JAVA实现,并详细分析了洛谷P1111、P2024、P1196三道题目的解题思路,涉及并查集在修复公路、食物链和银河英雄传说问题中的应用,包括并查集的构造、路径压缩、并集与查集操作以及在特定问题中的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

封装并查集类

萌新码风,功能有限,还请赐教。

成员变量

集合规模 n
父节点数组 fa

构造方法

两个构造方法
需要传入集合规模n,以便创建数组对象,默认规模为10000。

私有方法

查询根节点方法:int GetFather(int k)

查询k节点所在集合的根节点。

同时实现 路径压缩

公有方法

实现并集和查集
并集:boolean Merge(int a,int b)
查集:boolean Query(int a,int b)

代码:
public class DSU {
   
   
	
	private int n;
	
	private int[] fa;
	
	private int GetFather(int k)
	{
   
   
		if(k == fa[k])
		{
   
   
			return k;
		}
		fa[k] = GetFather(fa[k]);
		return fa[k];
	}
	
	public DSU()
	{
   
   
		this.(10000);
	}
	
	public DSU(int n)
	{
   
   
		this.n = n;
		fa = new int[n + 1];
		for(int i = 1;i <= n;i++)
		{
   
   
			fa[i] = i;
		}
	}
	
	public boolean Query(int a,int b)
	{
   
   
		if(a > n || a < 0 || b > n || b < 0)
		{
   
   
			return false;
		}
		return GetFather(a) == GetFather(b);
	}
	
	public boolean Merge(int a,int b)
	{
   
   
		if(a > n || a < 0 || b > n || b < 0)
		{
   
   
			return false;
		}
		if(Query(a, b))
		{
   
   
			return true;
		}
		fa[GetFather(a)] = GetFather(b);
		return true;
	}
}

题目总结

一道模板题:

洛谷P1111 修复公路

算是一道并查集的板子题,题目要求求出最早的全部连通时间。只需要对所有边按照时间排序,让他们按照出现先后加入图中。

一边加入一边判断,当边连接的两个点不在同一集合中便将其连通,同时减少连通块个数。

当连通块个数为1时,表示所有的村庄都连通到了图中,最后加入的边的出现时间输出得到答案并结束程序。

当整个加边的过程执行结束,程序仍旧没有结束,则可判定这些村庄不能连通在一起,输出-1.

java代码:

import java.util.Scanner;

class DSU {
   
   
	
	private int n;
	
	private int[] fa;
	
	private int GetFather(int k)
	{
   
   
		if(k == fa[k])
		{
   
   
			return k;
		}
		fa[k] = GetFather(fa[k]);
		return fa[k];
	}
	
	public DSU(int n)
	{
   
   
		this.n = n;
		fa = new int[n + 1];
		for(int i = 1;i <= n;i++)
		{
   
   
			fa[i] = i;
		}
	}
	
	public boolean Query(int a,int b)
	{
   
   
		if(a > n 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值