08.19总结

连通性

在无向图中,若任意两点间均存在路径相连,则该图称为连通图。
若删除图中任意一个顶点后,剩余图仍保持连通性,则该图为点双连通图。
若删除图中任意一条边后,图仍保持连通性,则该图为边双连通图。
在有向图中,若将所有有向边视为无向边后得到的图是连通的,则称该图为弱连通图。
若在有向图中任意两点间均存在双向可达路径,则该图称为强连通图。

强连通分量

强连通分量(Strongly Connected Components,简称SCC)是指图中的极大强连通子图。

在有向图的 DFS 生成树中,存在四种类型的边:

  1. 树边:黑色实线,表示从父节点指向未被访问的子节点
  2. 返祖边:红色虚线,指向祖先节点的边
  3. 前向边:绿色虚线,指向子树中节点的边
  4. 横叉边:蓝色虚线,指向已访问过且既非祖先也非子树中的节点

需要注意的是,前向边和横叉边仅存在于有向图的DFS生成树中,而无向图只有树边和返祖边。
关于 DFS 生成树与强连通分量(SCC)的关系:

  • 在某个 SCC 中,最先被访问的节点 uuu 具有重要特性
  • 该 SCC 中其他所有节点必定位于以 uuu为根的子树中

证明过程如下:
假设 SCC 中存在节点 vvv 不在 uuu 的子树中:
uuuvvv 的路径必然包含离开该子树的边(横叉边或返祖边)
这类边指向的节点必须已被访问过
由于 uuuvvv 属于一个SCC,访问这些更早被访问的节点时应该能到达uuu
这与u是最先被访问的前提矛盾,故假设不成立。

实现

void tarjan(int u) {low[u] = dfn[u] = ++tot;sta.push(u);in[u] = 1;for (auto v : ve[u]) {if (!dfn[v]) {tarjan(v);low[u] = min(low[u], low[v]);} else if (in[v]) {low[u] = min(low[u], dfn[v]);}}if (dfn[u] == low[u]) {vector <int> vnow;while (vnow.empty() || vnow.back() != u) {vnow.push_back(sta.top());in[sta.top()] = 0;sta.pop();}scc.push_back(vnow);}
}

缩点

在图论问题中,我们可以将强连通分量(SCC)缩成一个节点,从而将原图转化为有向无环图(DAG)。在进行缩点操作时,需要特别注意原图与新图中边的对应关系。

边双连通分量

将强连通分量中的有向边替换为无向边后,就形成了边双连通分量。这是因为在强连通分量中,任意两点 uuuvvv 之间都存在 uuuvvvvvvuuu 的路径。当转换为无向边时,这些路径保证了任意两点之间至少存在两条不同的路径连接,这正是边双连通分量 (BCC) 的定义特征。

实现

void tarjan(int u, int fa) {low[u] = dfn[u] = ++tot;sta.push(u);in[u] = 1;int mark = 0;for (auto v : ve[u]) {if (v == fa) {if (!mark) {mark = 1;} else {low[u] = min(low[u], dfn[v]);}continue;}if (!dfn[v]) {tarjan(v, u);low[u] = min(low[u], low[v]);} else {low[u] = min(low[u], dfn[v]);}}if (dfn[u] == low[u]) {vector <int> vnow;while (vnow.empty() || vnow.back() != u) {vnow.push_back(sta.top());in[sta.top()] = 0;sta.pop();}bcc.push_back(vnow);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93845.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93845.shtml

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

相关文章

车e估牵头正式启动乘用车金融价值评估师编制

8月13日&#xff0c;汽车金融行业职业能力评价规范编制启动工作会议在广州圆满落幕。本次会议由中国机械工业联合会机械工业人才评价中心主办&#xff0c;广州穗圣信息科技有限公司&#xff08;车e估&#xff09;承办。会议汇聚了众多行业精英&#xff0c;包括中国机械工业联合…

清空 github 仓库的历史提交记录(创建新分支)

想在 现有仓库中创建一个新分支 master&#xff0c;删除原来的 main&#xff0c;然后把 master 重命名为 main&#xff0c;并且清空历史。可以用下面一条完整的命令序列操作&#xff1a; # 1. 创建一个没有历史的新分支 master git checkout --orphan master# 2. 添加当前所有文…

使用B210在Linux下实时处理ETC专用短程通信数据(2)-CPU单核高速数据处理

在上一篇文章中&#xff0c;使用Octave初步验证了ETC车联数据的格式。然而&#xff0c;Octave无法实时处理20M的采样带宽。我们本节通过C语言&#xff0c;重写 Octave程序&#xff0c;实现实时处理&#xff0c;涉及下面三个关键特点。 文章目录1. 全静态内存2. 使用环状缓存3 无…

Spark 运行流程核心组件(二)任务调度

1、调度策略参数默认值说明spark.scheduler.modeFIFO调度策略&#xff08;FIFO/FAIR&#xff09;spark.locality.wait3s本地性降级等待时间spark.locality.wait.processspark.locality.waitPROCESS_LOCAL 等待时间spark.locality.wait.nodespark.locality.waitNODE_LOCAL 等待时…

Orbbec---setBoolProperty 快捷配置设备行为

在奥比中光&#xff08;Orbbec&#xff09;SDK&#xff08;通常称为ob库&#xff09;中&#xff0c;setBoolProperty函数是用于设置设备或传感器的布尔类型属性的核心接口。它主要用于开启/关闭设备的某些功能或模式&#xff0c;是配置设备行为的重要方法。 函数原型与参数解析…

[OWASP]智能体应用安全保障指南

1.关键组件定义 KC1 生成式语言模型&#xff08;Generative Language Models&#xff09; KC1.1 大语言模型&#xff08;LLMs&#xff09;&#xff1a;作为代理的“大脑”&#xff0c;基于预训练基础模型&#xff08;如 GPT 系列、Claude、Llama、Gemini&#xff09;&#xff…

【Vivado TCL 教程】从零开始掌握 Xilinx Vivado TCL 脚本编程(三)

【Vivado TCL 教程】从零开始掌握 Xilinx Vivado TCL 脚本编程&#xff08;三&#xff09; 系列文章目录 1、VMware Workstation Pro安装指南&#xff1a;详细步骤与配置选项说明 2、VMware 下 Ubuntu 操作系统下载与安装指南 3、基于 Ubuntu 的 Linux 系统中 Vivado 2020.1 下…

AI与大数据驱动下的食堂采购系统源码:供应链管理平台的未来发展

在数字化浪潮不断加速的今天&#xff0c;很多企业和机构都在追求一个目标&#xff1a;如何把“效率”与“成本”做到最佳平衡。对于学校、企事业单位的食堂来说&#xff0c;采购环节就是重中之重。往小了说&#xff0c;它关系到食堂员工的工作体验&#xff1b;往大了说&#xf…

HarmonyOS 实战:学会在鸿蒙中使用第三方 JavaScript 库(附完整 Demo)

摘要 在鸿蒙&#xff08;HarmonyOS NEXT / ArkTS&#xff09;开发中&#xff0c;我们大部分业务逻辑和 UI 都是用 ArkTS 写的。不过在做一些数据处理、网络请求、工具函数或者复杂算法时&#xff0c;完全没必要“重复造轮子”。这时候就可以直接引入 JavaScript 的第三方库。鸿…

C++实现教务管理系统,文件操作账户密码登录(附源码)

教务管理系统项目介绍 项目概述 这是一个基于C开发的教务管理系统&#xff0c;提供了学生、教师和系统管理员三种角色的功能模块&#xff0c;实现了教务信息的录入、查询、修改和删除等基本操作。系统采用文件存储方式保存数据&#xff0c;具有简单易用、功能完备的特点。 项…

《C++进阶之STL》【二叉搜索树】

【二叉搜索树】目录前言&#xff1a;------------概念介绍------------1. 什么是二叉搜索树?2. 二叉搜索树的性能怎么样&#xff1f;------------基本操作------------一、查找操作思想步骤简述二、插入操作目标步骤简述三、删除操作目标步骤简述------------代码实现--------…

Orange的运维学习日记--47.Ansible进阶之异步处理

Orange的运维学习日记–47.Ansible进阶之异步处理 文章目录Orange的运维学习日记--47.Ansible进阶之异步处理Playbook 执行顺序原理可选执行策略调整并发连接数&#xff1a;forks 参数查看与修改 forks性能调优建议分批执行全局任务&#xff1a;serial 关键字serial 用法示例应…

从一个ctf题中学到的多种php disable_functions bypass 姿势

题目介绍 题目是Lilctf2025 的php-jail-is-my-cry 比赛链接&#xff1a;https://lilctf.xinshi.fun/ 题目环境前半部分是 php最近的phar 新 trick 大佬的原理分析 https://fushuling.com/index.php/2025/07/30/%e5%bd%93include%e9%82%82%e9%80%85phar-deadsecctf2025-baby-we…

从繁琐到优雅:Java Lambda 表达式全解析与实战指南

在 Java 8 之前&#xff0c;我们习惯了用匿名内部类处理回调、排序等场景&#xff0c;代码中充斥着大量模板化的冗余代码。直到 Java 8 引入 Lambda 表达式&#xff0c;这一局面才得以彻底改变。作为一名深耕 Java 多年的技术专家&#xff0c;我见证了 Lambda 表达式如何从一个…

《当 AI 学会 “思考”:大语言模型的逻辑能力进化与隐忧》

引言&#xff1a;AI “思考” 的时代信号​大语言模型展现逻辑能力的典型场景&#xff1a;如复杂问题推理、多步骤任务规划的实例&#xff08;如 AI 辅助撰写科研思路、进行案件逻辑梳理等&#xff09;​提出核心议题&#xff1a;大语言模型逻辑能力的进化究竟达到了怎样的程度…

企业知识管理革命:RAG系统在大型组织中的落地实践

企业知识管理革命&#xff1a;RAG系统在大型组织中的落地实践 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;每一个特性都是我…

MySQL事务篇-事务概念、并发事务问题、隔离级别

事务事务是一组不可分割的操作集合&#xff0c;这些操作要么同时成功提交&#xff0c;要么同时失败回滚。acid事物的四大特性原子性最小工作单元&#xff0c;要么同时成功&#xff0c;要么同时失败。例如A转账300给B,A账户-300与B账户300必须满足操作原子性&#xff0c;避免出现…

C++高频知识点(二十三)

文章目录111. 谈谈atomic1. 什么是原子操作&#xff1f;2. std::atomic 的基本使用示例&#xff1a;基本使用3. 原子操作方法4. 内存模型与顺序一致性112. 引用成员变量是否占空间?1. 引用成员变量的定义2. 内存占用情况1. 成员变量的实际占用2. 类的总大小代码分析113. C中深…

云存储的高效安全助手:阿里云国际站 OSS

在这个数据爆炸的时代&#xff0c;数据存储和管理成为了众多企业和个人面临的一大挑战。想象一下&#xff0c;你是一位视频博主&#xff0c;随着粉丝量的增长&#xff0c;视频素材越来越多&#xff0c;电脑硬盘根本装不下&#xff0c;每次找素材都要花费大量时间。又或者你是一…

【线性基】P4301 [CQOI2013] 新Nim游戏|省选-

本文涉及知识点 C贪心 位运算、状态压缩、枚举子集汇总 线性基 P4301 [CQOI2013] 新Nim游戏 题目描述 传统的 Nim 游戏是这样的&#xff1a;有一些火柴堆&#xff0c;每堆都有若干根火柴&#xff08;不同堆的火柴数量可以不同&#xff09;。两个游戏者轮流操作&#xff0c;…