封装并查集类
萌新码风,功能有限,还请赐教。
成员变量
集合规模 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;
}
}
题目总结
一道模板题:
算是一道并查集的板子题,题目要求求出最早的全部连通时间。只需要对所有边按照时间排序,让他们按照出现先后加入图中。
一边加入一边判断,当边连接的两个点不在同一集合中便将其连通,同时减少连通块个数。
当连通块个数为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