您的位置:首页 > 其它

并查集的优化

2017-12-13 20:39 232 查看
#include <iostream>
#include <cstdio>
using namespace std;
#define maxn 20001
int father[maxn];
int m,n,i,x,y,q;

int find(int x){//寻找根节点编号并压缩路经,递归实现
if(father[x]!=x)
father[x]=find(father[x]);//路径压缩,优化的核心
return father[x];
}

void unio(int r1,int r2){ //合并两个集合
father[r2]=r1;
}

int main(){
cin>>n>>m;
for(i=1;i<=n;i++)
father[i]=i;//建立新的集合,其仅有的成员是i
for(i=1;i<=m;i++){
cin>>x>>y;
int r1=find(x);
int r2=find(y);
if(r1!=r2)unio(r1,r2);
}
cin>>q;
for(i=1;i<=q;i++){
cin>>x>>y;
if(find(x)==find(y))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}


代码:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 并查集