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 n∗m个子节点,其中有 k k k个节点的父亲为同一个,那么整个图中一共有多少个不同的父亲节点?
所以我们很容易就想到 并查集
∑
i
=
1
k
<
1
0
5
k
∈
n
∗
m
\sum_{i=1}^{k<10^5}k∈n*m
i=1∑k<105k∈n∗m
代码:
#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;
}