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

代码随想录算法训练营第五十五天|图论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.xdnf.cn/news/16600.html

相关文章:

  • 【音视频】WebRTC-Web 音视频采集与播放
  • 如何利用 Redis 的原子操作(INCR, DECR)实现分布式计数器?
  • CSS-in-JS 动态主题切换与首屏渲染优化
  • IBM Watsonx BI:AI赋能的下一代商业智能平台
  • 领域驱动设计(DDD)在分布式系统中的架构实践
  • jenkins连接docker失败【还是没解决】
  • 基于SpringBoot+MyBatis+MySQL+VUE实现的便利店信息管理系统(附源码+数据库+毕业论文+远程部署)
  • 计算机网络基础(一) --- (网络通信三要素)
  • 【C++算法】77.优先级队列_数据流的中位数
  • PHP云原生架构:容器化、Kubernetes与Serverless实践
  • 机器学习笔记(四)——聚类算法KNN、Kmeans、Dbscan
  • 深入理解 Qt 元对象系统 (Meta-Object System)
  • 架构实战——互联网架构模板(“用户层”和“业务层”技术)
  • 【Linux系统编程】Ext2文件系统
  • 【C++】指针
  • 【面试场景题】阿里云子账号设计
  • 【数据结构】用堆实现排序
  • JavaWeb 入门:JavaScript 基础与实战详解(Java 开发者视角)
  • 「源力觉醒 创作者计划」_文心大模型 4.5 多模态实测:开源加速 AI 普惠落地
  • 某雷限制解除:轻松获取原始下载链接,支持多任务转换
  • Hyperchain安全与隐私机制详解
  • Android Slices:让应用功能在系统级交互中触手可及
  • ElasticSearch 的3种数据迁移方案
  • RabbitMQ 消息持久化的三大支柱 (With Spring Boot)
  • 深度学习篇---百度AI Studio模型
  • JSON-RPC 2.0 规范
  • JVM知识点(2)
  • 二维经验模态分解(BEMD)算法详解与MATLAB实现
  • Python 程序设计讲义(28):字符串的用法——格式化字符串:format()方法
  • Spring Boot with RabbitMQ:四大核心模式指南