博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并查集学习
阅读量:5021 次
发布时间:2019-06-12

本文共 1636 字,大约阅读时间需要 5 分钟。

从来学习并查集

#include
#include
using namespace std;//封装好的并查集 class UF{
//union find private: vector
v;//存储各个结点 v[i]=j 表示 第i个结点的代表元是j(所在树的根结点) public: //初始化 UF(int n){
//初始化 总共有n个结点 刚开始的时候v[i]=i for(int i=0;i<=n;i++){ v.push_back(i); } } //根结点的查找 int Find(int x){
//查找x所在树的代表元(根结点) for(;;){ if(v[x]!=x) x=v[x]; else return x; } } //根结点的查找(递归) int Find2(int x){
//递归的方法来找根结点 if(v[x]==x) return x; else return Find2(v[x]); } //两棵树的合并 bool Union(int x,int y){
//把x和y合并 x=Find(x); y=Find(y); if(x==y) return false; else{ v[x]=y; return true; } } };int main(){ int n,m,src,dest,root,count; while(cin>>n&&n!=0){ UF uf(n);//n是城镇个数 m是当前公路个数 cin>>m; //输入边 构造并查集,并查集的构造 while(m--){ cin>>src>>dest;//输入边的两个顶点 if(uf.Find(src)!=uf.Find(dest)){
//如果这两个点不能连通, uf.Union(src,dest);//把这个量结点所在的树 合并 } } //逐个结点(城镇)检查是否连通,如果不连通就修一条路使她连通 count=0; root=uf.Find(1); for(int i=2;i<=n;i++){ if(UF.Find(i)!=root){ uf.Union(i,1); count++; } cout<
<

 

转载于:https://www.cnblogs.com/Elaine-DWL/p/6661848.html

你可能感兴趣的文章
函数中关于const关键字使用的注意事项
查看>>
微信架构(转)
查看>>
Web项目中的路径问题
查看>>
js随机数的取整
查看>>
关于解析漏洞
查看>>
十大经典预测算法(六)---集成学习(模型融合算法)
查看>>
用php做一个简单的注册用户功能
查看>>
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sizeof与Strlen的区别与联系
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>
easyui源码翻译1.32--Dialog(对话框窗口)
查看>>
阿里架构师,讲述基于微服务的软件架构模式
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>
asp.net mvc 错误处理 - 自定义报错处理,生成错误日志
查看>>
Linux centos ssh
查看>>
R语言之避免for循环示例
查看>>