蓝桥杯 合根植物 知识点:并查集模板题

62 阅读1分钟

13.合根植物 - 蓝桥云课 (lanqiao.cn)


#include <iostream>
using namespace std;
const int N=1000010;
//记录父根
int p[N];
int n,m,k;


int find(int x){
  if(p[x]!=x)p[x]=find(p[x]);
  return p[x];
}
void sovel()
{ 
  cin>>n>>m>>k;
  //初始化每个植物都没有节外生枝
  for(int i=1;i<=n*m;i++)
  {
    p[i]=i;
  }

  //合并树根
  while(k--)
  {
     int a,b;cin>>a>>b;
     int pa=find(a),pb=find(b);
     if(pa!=pb)  p[pa]=pb;
  }
     
     //注意这部分不要放k里面了,这里是对已经合并完的树根进行处理
     int res=0;
     for(int i=1;i<=n*m;i++)
     {
       if(p[i]==i)res++;  
     }
  cout<<res<<endl;
}
int main()
{
   cin.tie(nullptr)->sync_with_stdio(false);
   int t=1;
   while(t--)
   sovel();
  return 0;
}

image.png