并查集的优化
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;
}
代码:
#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;
}
代码:
相关文章推荐
- Pku2054 Color a Tree(并查集优化+堆优化+贪心)
- 并查集-一笔画优化
- POJ---1456(Supermarket ,贪心,并查集优化,处理冲突)
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】
- 算法:并查集的实现及简单优化
- 并查集的优化---路径压缩与启发式合并
- POJ-1456 Supermarket(贪心,并查集优化)
- bzoj1576[Usaco2009 Jan]安全路径Travel(堆优化dijkstra+并查集)
- POJ-1456 Supermarket(贪心,并查集优化)
- 并查集的两种优化(按秩合并,路径压缩)
- 并查集实现-(秩优化+路径压缩+java)
- 并查集的优化措施
- G - Supermarket ——贪心+并查集优化时间复杂度
- 并查集优化下-3
- *寒假水117——贪心【并查集优化】
- poj 1456 Supermarket 贪心 并查集优化
- Corporative Network UVA - 1329 加权并查集(压缩路径优化)
- POJ-2236 Wireless Network(并查集深度优化模板题)
- 并查集_森林_含秩的判断和路径优化
- 并查集,battles over cities,路径压缩,优化与封装,无向图连通性