/
并查集优化1
作者:Zhihang
(附:这是俺滴原创,盗用请看本程序最底下)
/
using namespace std;
const int n=5; //数据数量
int father[n]; //父亲节点
int zi[n]; //一个数据的层数 QQ:1184191599
int parents(int v){ //找祖宗节点
while(v!=father[v]){
father[v]=father[father[v]];
v=father[v];
}
return v;
}
void _union(int v,int w){ //合并
int parents_v=parents(v); //找到祖宗
int parents_w=parents(w);
if(zi[parents_v]>zi[parents_w]){ //看哪个祖宗的子孙多(层数)
father[parents_w]=father[parents_w];
}
else if(zi[parents_w]>zi[parents_v]){
father[parents_v]=parents_w;
}
else if(zi[parents_v]==zi[parents_w]){
father[parents_v]=parents_w;
zi[parents_v]++;
}
}
bool find(int v,int w){ //查找两个点是否连着了
if(parents(v)==parents(w)){ //找到两个点的祖宗节点,
return true; //如果一样返回 真
}
else{ //否则返回 假
return false;
}
}
int main(){
//初始化
for(int i=0;i<n;i++){
father[i]=i;
zi[i]=0;
}
//测试
_union(1,5);
_union(2,5);
_union(1,3);
_union(3,4);
cout<<find(2,4);
return 0;
}
//先Ctrl+A 再Ctrl+C 最后Ctrl+V