当前位置: 首页 > news >正文

代码随想录算法训练营第五十五天|图论part5

并查集理论基础

初始化:

void init() {for (int i = 0; i < n; ++i) {father[i] = i;}
}

寻根:

// 并查集里寻根的过程
int find(int u) {return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
}

判断u跟v是否同根

// 判断 u 和 v是否找到同一个根
bool isSame(int u, int v) {u = find(u);v = find(v);return u == v;
}

加入并查集:

// 将v->u 这条边加入并查集
void join(int u, int v) {u = find(u); // 寻找u的根v = find(v); // 寻找v的根if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回father[v] = u;
}

按秩合并的代码如下:
 

int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好
vector<int> father = vector<int> (n, 0); // C++里的一种数组结构
vector<int> rank = vector<int> (n, 1); // 初始每棵树的高度都为1// 并查集初始化
void init() {for (int i = 0; i < n; ++i) {father[i] = i;rank[i] = 1; // 也可以不写}
}
// 并查集里寻根的过程
int find(int u) {return u == father[u] ? u : find(father[u]);// 注意这里不做路径压缩
}// 判断 u 和 v是否找到同一个根
bool isSame(int u, int v) {u = find(u);v = find(v);return u == v;
}// 将v->u 这条边加入并查集
void join(int u, int v) {u = find(u); // 寻找u的根v = find(v); // 寻找v的根if (rank[u] <= rank[v]) father[u] = v; // rank小的树合入到rank大的树else father[v] = u;if (rank[u] == rank[v] && u != v) rank[v]++; // 如果两棵树高度相同,则v的高度+1,因为上面 if (rank[u] <= rank[v]) father[u] = v; 注意是 <=
}

寻找存在的路径

文章讲解:代码随想录

题目链接:107. 寻找存在的路径

思路:

并查集裸题,考察两个节点的连通性

#include <iostream>
#include <vector>
using namespace std;
int n=101;
vector<int>father(n,0);void init(){for(int i=0;i<n;i++){father[i]=i;}
}int find(int x){if(father[x]==x)return x;else return father[x]=find(father[x]);
}
void join(int u,int v){u=find(u);v=find(v);if(u==v) return;father[v]=u;
}
bool isSame(int u,int v){u=find(u);v=find(v);return u==v;
}int main(){int n,m;cin>>n>>m;init(); // 初始化并查集    上面只是定义 这里要调用for(int i=0;i<m;i++){int s,t;cin>>s>>t;join(s,t);     //这里构建并查集}int source,dest;cin>>source>>dest;bool ans=isSame(source,dest);if(ans)cout<<1;else cout<<0;}
http://www.dtcms.com/a/305987.html

相关文章:

  • 【CF】Day115——杂题 (构造 | 区间DP | 思维 + 贪心 | 图论 + 博弈论 | 构造 + 位运算 | 贪心 + 构造 | 计数DP)
  • Python 程序设计讲义(43):组合数据类型——元组类型:元组的常用操作
  • KONG API Gateway中的核心概念
  • List 接口
  • 逻辑回归:从线性回归到分类决策的演化
  • Spark大数据分与实践笔记(第五章 HBase分布式数据库-04)
  • Java学习------Object类
  • Qt 与物联网(IoT)开发
  • (补题)小塔的饭
  • 算法-CodeTop(三)
  • PyTorch生成式人工智能(21)——归一化流模型(Normalizing Flow Model)
  • 【机器学习11】“分类算法“评估矩阵:从对数损失、AUC和ROC、混淆矩阵与分类报告等角度来评估算法
  • 第十九周-文档数据库MongoDB、消息队列和微服务
  • C++代码题部分(1)
  • 双功能预测模型开发:基于预训练模块与迁移学习的天然肽序列与SAFP修饰信息融合
  • 基于uni-app的血糖血压刻度滑动控件
  • uniApp实战六:Echart图表集成
  • uniapp-vue3来实现一个金额千分位展示效果
  • 《CLIP改进工作串讲》论文精读笔记
  • uniapp使用谷歌地图获取位置
  • uniapp实现微信小程序导航功能
  • 从单机到分布式:Redis如何成为架构升级的胜负手
  • 问题1:uniapp在pages样式穿刺没有问题,在components组件中样式穿刺小程序不起效果
  • Oracle迁移PostgreSQL隐式类型转换配置指南
  • FPGA实现CameraLink视频解码转SRIO与DSP交互,FPGA+DSP多核异构图像处理架构,提供2套工程源码和技术支持
  • Windows Server 2019 查询最近7天远程登录源 IP 地址(含 RDP 和网络登录)
  • 【OD机试题解法笔记】符号运算
  • AWS Blockchain Templates:快速部署企业级区块链网络的终极解决方案
  • Keil-C51 与 Keil -ARM 项目工程兼容的方法
  • leetcode热题——搜索二维矩阵Ⅱ