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

封装并查集类

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

成员变量

集合规模 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 || a 

你可能感兴趣的:(题解,算法,java,数据结构)