蓝桥杯-合根植物(并查集)

合根植物

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);
	}
}

posted @   Garrett_Wale  阅读(172)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示