/
并查集优化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
zi[i]=0;
}
//测试 _union(1,5); _union(2,5); _union(1,3); _union(3,4); cout<}
//先Ctrl+A 再Ctrl+C 最后Ctrl+V



