首页 > 技术文章 > 蓝桥杯-合根植物(并查集)

GarrettWale 2020-03-13 11:12 原文

合根植物

PREV-54

  • 这题主要考察的也是并查集。
  • 直接应用并查集的模板就可以了。
/*第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,n<1000)。
  接下来一行,一个整数k,表示下面还有k行数据(0<k<100000)
  接下来k行,第行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。*/
package lanQiao;
import java.io.*;
import java.util.*;
public class T458 {
	static int []set=new int[1000006];//初始化为i
	static int []rank1=new int[1000006];//rank1[i]表示i的深度,初始化为0
	static int[][]root=new int[1003][1003];
	static int find(int x){
	    if(x==set[x])
	        return set[x];
	    return set[x]=find(set[x]);
	}
	static void merge(int a,int b){
	    int ta=find(a);
	    int tb=find(b);
	    if(ta!=tb){
	        if(rank1[ta]<rank1[tb]){
	            set[ta]=tb;
	        }else{
	            set[tb]=ta;
	            if(rank1[ta]==rank1[tb]){
	                rank1[ta]++;
	            }
	        }
	    }else return;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
		
		Scanner cin=new Scanner(System.in);
		int m,n;
		m=cin.nextInt();
		n=cin.nextInt();
		int k=cin.nextInt();
		int be=1;
		Arrays.fill(rank1,0);
		for(int i=0;i<=m*n;i++) {
			set[i]=i;
		}
		for(int i=0;i<m;i++) {
			for(int j=0;j<n;j++) {
				root[i][j]=be++;
			}
		}
		for(int i=0;i<k;i++) {
			int u,v;
			u=cin.nextInt();v=cin.nextInt();
			merge(u,v);
		}
		int ans=0;
		for(int i=0;i<m;i++) {
			for(int j=0;j<n;j++) {
				int ro=root[i][j];
				if(set[ro]==ro) {
					ans++;
				}
			}
		}
		System.out.println(ans);
	}
}

推荐阅读