并查集---模板题可背
题目:合根植物
#include<bits/stdc++.h>
using namespace std;
#define Maxn 2000000//假设需要数量为2000000
int fa[Maxn+1];
void init(){
for(int i=0;i<=Maxn;i++)
fa[i]=i;
}
int find(int x){//查找,路径压缩
if(x==fa[x])
return x;
else{
fa[x]=find(fa[x]);//父节点设为根节点
return fa[x];//返回父节点
}
}
void merge(int i,int j){{//合并
fa[find(i)]=find(j);
}
int n,m;//n行,m列
int k;
int main(){
init();
cin>>n>>m>>k;
int a,b;
for(int i=1;i<=k;i++){
cin>>a>>b;
merge(a,b);//合根
}
int ans=0;
for(int i=1;i<n*m;i++){
if(fa[i]==i){//找根节点
ans++;
}
}
cout<<ans+1;
return 0;
}
题目:修改数组
#include<bits/stdc++.h>
using namespace std;
#define Maxn 2000000//假设需要数量为2000000
int fa[Maxn+1];
void init(){
for(int i=0;i<=Maxn;i++)
fa[i]=i;
}
int find(int x){//查找,路径压缩
if(x==fa[x])
return x;
else{
fa[x]=find(fa[x]);//父节点设为根节点
return fa[x];//返回父节点
}
}
void merge(int i,int j){//合并
fa[find(i)]=find(j);
}
int main(){
init();
int n;
cin>>n;
int a,b;
for(int i=1;i<=n;i++){
int t;
cin>>t;
t=find(t);
cout<<t<<" ";
merge(t,t+1);
}
return 0;
}