题目描述
w星球的一个种植园,被分成m x n
个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。
如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?
输入描述
输出描述
输出植物数量。
输入输出样例
输入:
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
最终代码
1. c/c++
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int s[N];
int find_set(int x){
if(x!=s[x])
s[x]=find_set(s[x]);
return s[x];
}
int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=N;i++) //初始化并查集
s[i]=i;
while(k--){
int a,b;
scanf("%d%d",&a,&b);
int pa = find_set(a),pb=find_set(b);
if(pa!=pb) //合并并查集
s[pa] = pb;
}
int ans=0;
for(int i=1;i<=n*m;i++)
if(s[i]==i)
ans++;
printf("%d",ans);
return 0;
}