【复习】【并查集】

并查集:
若干个元素不断放入共同的“堆”里面,中途查询某两个元素是否属于同一个堆

初始化:
将每个元素放在以自己为编号的“堆”

for(int i=1;i<=n;i++) f[i]=i;

路径压缩找相同的“堆”(找父亲)

public static int find(int x) {
     
	if(f[x]==x) return x;
    return f[x]=find(f[x]);
}

合并两个元素
先判断是否处于同一个“堆”,如果不是就合并

public static void merge(int x,int y) {
     
	int fx=find(x),fy=find(y);
	if(fx!=fy) f[fx]=fy;
}

板子:洛谷1551:

import java.io.*;
import java.util.*;
public class structure {
     
    public static int[] f=new int[5005];
    public static int n,m,p;
    public static int find(int x) {
     
        if(f[x]==x) return x;
        return f[x]=find(f[x]);
    }
    public static void merge(int x,int y) {
     
        int fx=find(x),fy=find(y);
        if(fx!=fy) f[fx]=fy;
    }
    public static void main(String[] args) {
     
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        p=in.nextInt();
        for(int i=1;i<=n;i++) f[i]=i;
        for(int i=1;i<=m;i++) {
     
            int a=in.nextInt(),b=in.nextInt();
            merge(a,b);
        }
        for(int i=1;i<=p;i++) {
     
            int a=in.nextInt(),b=in.nextInt();
            int fa=find(a),fb=find(b);
            if(fa==fb) System.out.println("Yes");
            else System.out.println("No");
        }
    }
}

你可能感兴趣的:(java学习,复习,数据结构-并查集)