蓝桥杯 合根植物 JAVA

思路:使用并查集,首先格子中的每个数都以自己为根节点(此时共有m*n个集合),然后根据输入的k个数据将其连通(当两个数的根节点不一样,则说明可以连通,否则说明已在一个集合中),每次连通将集合数减1。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
 * 并查集
 */
public class 合根植物 {
    static int m, n, k;
    static int[] id;
    static int count;
    static int[][] data;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();
        n = sc.nextInt();
        k = sc.nextInt(); // 接来下k行数据
        
        id = new int[m*n+1];
        count = m*n;
        
        data = new int[k][2];
        
        for(int i=0;i<k;i++){
            int x = sc.nextInt();
            int y = sc.nextInt();
            data[i][0] = x;
            data[i][1] = y;
        }
        
        //初始化数组
        for(int i=1;i<id.length;i++){
            id[i] = i;
        }
        
        for(int i=0;i<data.length;i++){
            union(data[i][0],data[i][1]);
        }
        System.out.println(count);
    }
    
    //找到p的根
    public static int find(int p){
        while(p!=id[p])
            p = id[p];
        return p;
    }

    public static void union(int i,int j){
        int iRoot = find(i);
        int jRoot = find(j);
        if(iRoot==jRoot){
            return;
        }else{
            //id[iRoot] = jRoot;
            id[jRoot] = iRoot;
            count--;
        }
    }
}
原文地址:https://www.cnblogs.com/blzm742624643/p/10375445.html