继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

C/C++算法(并查集优化后)

纸女神
关注TA
已关注
手记 13
粉丝 141
获赞 112

/
并查集优化1
作者:Zhihang
(附:这是俺滴原创,盗用请看本程序最底下)
/

include<iostream>

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

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP