并查集虽然是数据结构,但还是把它 放在图论里总结了吧,后面用最小生成树是要涉及到。
个人理解并查集就是用来处理集合,"并"是合并两个集合,“差”是查找一个的元素在哪个集合里,“集”就是集合啦。
并查集的关键就是用一个集合中代表元素来代表该集合。
上模板:
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=20001;
int father[maxn];
int find(int x){
if(x!=father[x])father[x]=find(father[x]);
return father[x];
}
void unionn(int r1,int r2){
father[r2]=r1;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)father[i]=i;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
int r1=find(x);
int r2=find(y);
if(r1!=r2){
unionn(r1,r2);
}
}
}
记得father数组的初始化,find函数这样写可以避免长链表。