图论(强联通分量)

在图论中,特别是在讨论有向图(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.rhkb.cn/news/393354.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redisson可重入锁原理(基于黑马视频总结,保姆级)

上一篇文章我们基于redis的set nx ex 命令以及Lua脚本实现了基本的分布式锁&#xff0c;但是还存在一下几点问题。于是又引出了redisson。 为什么基于SETNX的分布式锁无法实现可重入 先在method1中获取锁&#xff0c;获取成功后又调用method2&#xff0c;而method2内部也会获取…

spring+SSM+Mybatis面试题(上)(30道)

目录 1. 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?2. Spring IOC 如何理解?3. Spring DI 如何理解?4. Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?1.配置作用域需要注解Scope(“Singleton”)2.开启延迟加载&#xff1a;La…

脚本:自动生成精准的Oracle AWR报告

很多朋友把AWR报告发过来让我帮忙分析Oracle数据库的性能&#xff0c;但很多报告都有一个共同的缺陷&#xff1a;就是这些报告覆盖的时间范围太广&#xff0c;导致性能问题的数据被严重稀释。 英文原文&#xff1a;Script: Generating Focused AWR Reports 为了解决这个问题&a…

完美解决pip命令版本冲突导致对应版本模块包无法安装的问题

解决步骤 使用pip更新/降低指定模块包命令格式降低pip自身至指定版本的命令再次换源安装指定模块包 在对 FasterNet 这篇论文源码复现过程中&#xff0c;我们首先需要安装相关依赖文件&#xff08; path/to/your/requirements.txt&#xff09; -extra-index-url https://down…

临床数据科学中如何用R来进行缺失值的处理(上)

在临床科研中&#xff0c;由于失访、无应答或记录不清等各种原因&#xff0c;经常会遇到数据缺失的问题。本文将深入探讨医学科研中数据缺失的成因、分类、影响以及应对方法&#xff0c;结合R语言的实际应用&#xff0c;为医学研究人员提供全面的解决方案。 一、认识缺失数据 …

【生成式人工智能-四-chatgpt的训练过程-pretrain预训练自督导式学习督导式学习】

大模型是怎么被训练出来的具有人类智慧的 阶段一训练-自我学习-具备知识训练资料self-supervised learning&#xff08;自督导式学习&#xff09; 阶段二-怎么让模型具备人的智慧supervised learning 督导式学习预训练pretrain为什么要用预训练的模型&#xff1f;Adapter逆向工…

红外遥控风扇——arduino

红外遥控风扇——arduino 本节课任务红外遥控红外遥控通信过程红外遥控套件红外遥控接线实现风扇的多种换挡方式用本节课所学的红外遥控&#xff0c;控制RGB彩灯变换颜色&#xff0c;至少配置4种 本节课任务 1、了解红外遥控技术在生活中的运用。 2、学会编程测试红外遥控器的…

WPF-实现多语言的静态(需重启)与动态切换(不用重启)

一、多语言切换&#xff08;需重启&#xff09; 1、配置文件添加Key <appSettings><add key"language" value"zh-CN"/></appSettings> 2、新增附加属性当前选择语言 public CultureInfo SelectLanguage{get > (CultureInfo)GetValu…

C#初级——List 容器

容器 在C#中&#xff0c;容器通常指的是用于存储和组织数据的集合类。 本文介绍的容器是动态数组&#xff1a;List<T> 内部使用数组来存储元素&#xff0c;当添加元素超出当前数组容量时&#xff0c;会自动调整大小&#xff08;扩容&#xff09;。 list容器 List<&g…

用数组表达双链表

大体思想跟单链表相同&#xff0c;只不过双链表每个节点有两个指向&#xff1a; 单链表只能指向一个节点(下一个节点) 而双链表可以指向两个节点(上下两个节点) 代码分析 1、定义 在这里没有定义head&#xff0c;直接让0号点是head&#xff0c;下标为1的点是最右边的 //e[i…

Spring Boot 中使用 JSON Schema 来校验复杂JSON数据

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 在应用程序接口&#xff08;API&#xff09;的开发中&#xff0c;JSON作为一种数据交换格式被广泛利用。然而&#xff0c;对数据的结构和规则进行标准化是至关重要的&#xff0c;这正是JSON Schema发挥…

模拟一次XFS故障,分析原因并进行修复

模拟一次XFS故障 在平常处理问题时经常会遇到文件系统损坏的问题&#xff0c;有时候是日志里面出现了报错但文件系统还是可以读写&#xff0c;有时候是文件系统已经无法读写了 分析下不同现象的原因和一些可能出现的情况。 通过直接修改块存储损坏文件系统 1、制作一个xfs文…

Android图像显示SurfaceFlinger总结

1 介绍 1.1 框架中位置 ​​ 上图为Android的图形显示系统框架图。 首先上层应用通过ViewRoot的scheduleTraversals函数发起绘制任务&#xff0c;并通过HWUI调用OpenGL接口将绘制数据传递给GPU处理&#xff1b;SF会接收所有应用更新的绘制数据&#xff0c;并根据Z-Order、透明…

计算机网络(网络层)

网络层概述 网络层是干什么的&#xff1f; 网络层的主要任务是实现不同异构网络互连&#xff0c;进而实现数据包在各网络之间的传输相比于数据链路层的以太网通信&#xff0c;网络层则是将一个个数据链路层连接的以太网通过路由器连接起来。从而实现不同数据链路层的互联。 这…

​【香菇带你学Mysql】Mysql超长执行sql定位和优化【建议收藏】

本文为MySQL数据库管理员和开发人员提供了一套全面的超时SQL定位和优化解决方案。通过合理运用这些方法和技巧&#xff0c;可以显著提升MySQL数据库的性能和稳定性&#xff0c;减少超时SQL语句的发生&#xff0c;确保数据库的高效运行。 0. 引言 最近某个Mysql数据库频繁告警…

登录页滑块验证图

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> <b…

【Kubernetes】k8s集群中pod的容器资源限制和三种探针

目录 一.关于pod容器的资源限制 1.资源限制的单位 1.1.CPU 资源单位 1.2.内存 资源单位 二.关于QOS服务质量&#xff08;pod的调度和驱逐有限制&#xff09; 1.QoS服务质量分类 2.驱逐顺序 三.关于pod容器的三种探针 1.探针的三种规则 2.Probe支持三种检查方法 3.探…

docker安装及使用

一、docker优点及作用 优点&#xff1a; 基础镜像MB级别创建简单隔离性强启动速度秒级移植与分享放便 作用&#xff1a;资源隔离 cpu、memory资源隔离与限制访问设备隔离与限制网络隔离与限制用户、用户组隔离限制 二、docker安装 2.1.配置yum源 yum install -y yum-uti…

Mysql开启SSL

等二测出未开启SSL,如下 have_openssl、have_ssl都是DISABLED也不知道当时为啥没开&#xff0c;看最近的都是开启的,整改必去得开了&#xff0c;开启步骤 1.生成秘钥 进入mysql的bin目录下&#xff0c;运行 ./mysql_ssl_rsa_setup运行后会生成证书 默认证书会在mysql的data…

主从备份(复制)

一、备份的三种类型 备份的三种主要类型包括热备份、逻辑备份和物理备份&#xff0c;每种备份类型都有其特定的应用场景和优缺点。 1. 热备份 定义&#xff1a; 热备份是在数据库或系统处于正常运行状态下进行的备份。这种备份方式允许在不停机的情况下对数据库或系统数据进…