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

图论(强联通分量)

在图论中,特别是在讨论有向图(Directed Graph)时,我们常常需要了解图的结构特性,比如强联通分量(Strongly Connected Components, SCC)。了解强联通分量中的各种边对于理解图的整体结构以及某些算法(如Tarjan's算法或Kosaraju's算法)是非常重要的。以下是对强联通分量及其边类型的解释:

强联通分量(SCC)

强联通分量是一个子图,其中每对顶点之间都有路径相互可达。换句话说,一个强联通分量内的任意两个顶点 u 和 v 都满足 u 到 v 和 v 到 u 之间存在路径。

边的分类

板子如下

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int> e[N];       // 存储图的邻接表
int dfn[N], low[N];     // 存储每个节点的时间戳和最小到达时间
bool ins[N];            // 标记节点是否在栈中
int idx, bel[N], cnt;   // 时间戳、节点所属的强联通分量编号、强联通分量计数
stack<int> stk;         // 用于 Tarjan 算法的栈
vector<vector<int>> scc;// 存储所有的强联通分量
int n, m;               // 节点数和边数void dfs(int u) {dfn[u] = low[u] = ++idx; // 初始化时间戳ins[u] = true;           // 标记节点在栈中stk.push(u);             // 将节点压入栈中for (auto v : e[u]) {    // 遍历节点 u 的所有邻接点 vif (!dfn[v]) {       // 如果节点 v 尚未访问dfs(v);          // 递归访问节点 vlow[u] = min(low[u], low[v]); // 更新节点 u 的最小到达时间} else if (ins[v]) { // 如果节点 v 在栈中low[u] = min(low[u], dfn[v]); // 更新节点 u 的最小到达时间}}if (dfn[u] == low[u]) {  // 如果节点 u 是强联通分量的根节点vector<int> c;       // 创建一个新的强联通分量++cnt;while (1) {int v = stk.top(); // 弹出栈顶节点c.push_back(v);    // 将节点添加到当前强联通分量中ins[v] = false;    // 标记节点不在栈中bel[v] = cnt;      // 标记节点所属的强联通分量编号stk.pop();         // 弹出栈顶节点if (u == v) break; // 如果节点 u 是栈顶节点,结束循环}sort(c.begin(), c.end()); // 对强联通分量内的节点排序scc.push_back(c);         // 将强联通分量添加到结果中}
}int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for (int i = 1; i <= m; i++) {int u, v;cin >> u >> v;e[u].push_back(v); // 构建邻接表}for (int i = 1; i <= n; i++) {if (!dfn[i]) dfs(i); // 对每个未访问的节点进行 DFS}sort(scc.begin(), scc.end()); // 对所有的强联通分量排序cout << cnt << endl;          // 输出强联通分量的数量for (auto c : scc) {          // 输出每个强联通分量for (auto u : c) {cout << u << " ";}cout << endl;}return 0;
}

题目链接 洛谷 B3609

参考文献 scc

http://www.lryc.cn/news/417310.html

相关文章:

  • LLaMA- Adapter V2: Parameter-Efficient Visual Instruction Model
  • 【爬虫实战】利用代理爬取Temu电商数据
  • 【MATLAB源码-第244期】基于MATLAB的BP神经网络语音特征信号分类,输出原信号与预测信号对比图以及预测误差和正确率。
  • HarmonyOS 习题(二)
  • 如何搭建一个圈子社区系统?开源社交陪玩交友圈子论坛帖子系统保姆级搭建教程!
  • Delphi5实现身份证检验(DLL版)
  • linux下的C++程序
  • selfAttention 中的dk到底是什么
  • 安装MongoDB UI客户端工具:mongodb-compass-1.40.2-win32-x64.msi
  • 一行命令搞定内网穿透
  • C语言——扫雷游戏
  • 【LLM】-16-评估LLM-与标准答案的差距
  • WeNet 2.0:更高效的端到端语音识别工具包
  • 阿里大模型调用 = 》通义千问大语言模型
  • idea使用free流程,2024idea免费使用
  • 算法_链表专题---持续更新
  • 在Windows MFC\C++编程中,如何使用OnCopyData函数
  • 【Qt】项目代码
  • MySQL中常用工具
  • 关于儿童编程语言
  • [io]进程间通信 -信号函数 —信号处理过程
  • RoboDK的插件
  • List<HashMap<String, Object>>排序
  • 【大数据】探索大数据基础知识:定义、特征与生态系统
  • 营销材料翻译质量对销售渠道的影响
  • centos7.9安装k8s 1.3
  • 【第七节】python多线程及网络编程
  • Linux Shell编程--变量
  • 软文写作必须掌握的技巧有哪些?
  • 探索灵办AI:智能办公的好帮手