P8654 [蓝桥杯 2017 国 C] 合根植物 详解

这篇文章讨论了在给定的m×n网格中种植合根植物的问题,实际考察的是并查集算法的应用。通过计算有k个节点父亲相同的图中不同父亲节点的数量,代码实现使用了并查集数据结构来解决此问题。
摘要由CSDN通过智能技术生成

P8654 [蓝桥杯 2017 国 C] 合根植物 详解

题目传送门

分析题目:

分成 m × n 个小格子 分成 m × n 个小格子 分成m×n个小格子 种了一株合根植物

数据范围:

1<m,n<1000

0 < k < 1 0 5 0<k<10^5 0<k<105

分析一下,我们就会发现——

其实跟合不合根没啥关系,翻译成下面这段话考的一样——

共有 n ∗ m n*m nm个子节点,其中有 k k k个节点的父亲为同一个,那么整个图中一共有多少个不同的父亲节点?

所以我们很容易就想到 并查集
∑ i = 1 k < 1 0 5 k ∈ n ∗ m \sum_{i=1}^{k<10^5}k∈n*m i=1k<105knm
代码:

#include<bits/stdc++.h>
using namespace std;
int m,n;
int k,x,y,ans;
int f[1000005];
int findfather(int x)
{
	if(f[x]==x)
	{
		return x;
	}
	else
	{
		f[x]=findfather(f[x]);
		return f[x];
	}
}
void Union(int x,int y)
{
	f[findfather(x)]=f[findfather(y)];
	return;
}
void init()
{
	for(int i=1;i<=m*n;i++)
	{
		f[i]=i;
	}
	return;
}
int main(){
	scanf("%d%d%d",&m,&n,&k);
	init();
	for(int i=1;i<=k;i++)
	{
		scanf("%d%d",&x,&y);
		Union(x,y);
	}
	for(int i=1;i<=m*n;i++)
	{
		if(f[i]==i)
		{
			ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
}

AC记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值