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

【题解】合根植物

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

【题目描述】

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


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

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

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

    相关文章

    【题解】光荣的梦想

    【题目描述】Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯。在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界、保卫这里的平衡与和谐。在那个时代,平...

    【题解】柠檬水找零

    【题目描述】在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你...

    【题解】石子合并

    【题目描述】在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。设计一个程序,计算出将N堆石子合并成一堆的...

    【题解】切割钢管

    【题解】切割钢管

    【题目描述】小A是某工地的计算工程师。工地现有 n 根钢管,第 i 根钢管的长度为 ai。现在想用这 n 根钢管来做一个支撑用的柱子。我么可以切割这些钢管成为更短的钢管,但是不能缝合两根钢管。为了安全...

    【题解】二分法查找左边界

    参考代码:# include <bits/stdc++.h> using namespace std; int a[100005];&...

    【题解】开关灯(1)

    【题目描述】假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。第一个人(1号)将灯全部关闭,第二个人(2号...