当前位置:首页 > 题解目录 > 正文内容

【题解】合根植物

亿万年的星光2年前 (2023-04-08)题解目录1660

【题目描述】

w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。

这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。

如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?

【输入描述】

第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,n<1000)。

接下来一行,一个整数k,表示下面还有k行数据(0<k<100000)

接下来k行,第2+k行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。

格子的编号一行一行,从上到下,从左到右编号。

比如:5 * 4 的小格子,编号:

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20

【输出描述】

一行,表示有多少株?

【样例输入】

5 4
16
2 3
1 5
5 9
4 8
7 8
9 10
10 11
11 12
10 14
12 16
14 18
17 18
15 19
19 20
9 13
13 17

【样例输出】

5


【题目分析】



【参考答案】

#include<iostream>
using namespace std;
const int MAX=1000010;			//数组的最大长度(即图中点个数的最大值)
int m,n;						//当前图的长宽规格
int p[MAX];					//用于存放每个点的根节点
 //寻找根节点函数
int find(int x)		  
{
	if(p[x]==x) return x;
	return p[x]=find(p[x]);
}
//合并函数
void merge(int x,int y)		   
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy) 
		p[fx]=fy;
}

int main() 
{
	int x,y,line;
	cin>>m>>n>>line;
	//初始化 
	for(int i=1;i<=n*m;i++)
		p[i]=i;
	//合并 
	for(int i=0;i<line;i++)
	{
		cin>>x>>y;
		merge(x,y);
	}
	int ans=0,a[MAX]={0};
	for(int i=1;i<=m*n;i++)
		a[find(i)]=1;
	for(int i=1;i<=m*n;i++)
		if(a[i]) ans++;
	cout<<ans<<endl;
	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 并查集
分享给朋友:

相关文章

【题解】分发饼干

【题目描述】假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;...

【题解】结构体与闰年

【题目描述】定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。【输入描述】年月日【输出描述】当年第几天【样例输入】2000 12 31【样例输出】366...

【题解】将钱分给最多的儿童

【题目描述】给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。你需要按照如下规则分配:...

【题解】最长不下降子序列2

【题目描述】设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)≠b(j)(i≠j),若存在i1<i2<i3<…<ie 且有b...

【题解】区间和

【描述】输入一个整数Q,进行Q次询问,每次给定两个整数l和r,每一次输出l~r中所有平方数的和 % 1000000007【输入】第一行是一个整数Q后面的Q行每行有2个数字l和r【输出】Q行,...

【题解】解密

【题解】解密

【题目描述】给定一个正整数k,有k次询问,每次给定三个正整数ni,ei,di,求两个正整数pi,qi。使ni=pi *  qi,  ei * di =(pi -1) *(qi-1)...