双连通分量算法

1. 连通图概念

连通图:无向图任意两点之间存在通路。
强连通:有向图(前提)中,任意两点都有至少一条通路,则此图为强连通图。
弱连通图:将有向图的有向边换成无向边得到的图是连通图,则此有向图是弱连通图。

1.1 连通图和强连通图区别

连通图和强连通图的主要区别在于它们处理无向图和有向图的方式。以下是详细介绍:

连通图。 连通图的概念基于无向图,其中如果任意两个顶点之间都存在一条路径,那么整个图被称为连通图。这意味着,从任何一个顶点出发,都可以通过路径到达图中的任何其他顶点。
强连通图。 强连通图的概念则针对有向图,其中不仅要求从顶点vi到顶点vj存在路径,还要求从顶点vj到顶点vi也存在路径,对于所有顶点对vi和vj。这意味着图中不存在方向性的障碍,任意两个顶点之间可以相互到达。
简而言之,连通图关注的是无向图中顶点的连接性,而强连通图关注的是有向图中顶点的双向连接性。

2. Targan强连通分量算法

2.1 基本概念

强连通分量: 在有向图G中,如果两个顶点u,v间(u->v)有一条从u到v的有向路径,同时还有一条从v到u的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图极大强连通子图,称为强连通分量。
在这里插入图片描述
α \alpha α β \beta β γ \gamma γ 是三个强连通分量。

2.1 DFS遍历

在这里插入图片描述
方式1可以看作前序遍历
在这里插入图片描述
方式2可以看作后序遍历

3. 举例

在这里插入图片描述
回溯,更新$j$
在这里插入图片描述
相同 j j j出栈
在这里插入图片描述
a a a也出栈,单独连通分量。
在这里插入图片描述

4. 代码实现

在这里插入图片描述

#include <bits/stdc++.h>using namespace std;#define M (INT_MAX)
#define PRINT_ARRAY(a,n)    do{for(int i = 0; i < n; i++) cout<<a[i]<<"|"; cout<<endl;}while(0)/**********************************************1 → 0 → 3↑ ↙     ↓2       43 → 4 ← 6 → 2↑↓  ↓ ↗ ↓ ↙↑7 → 5 → 0 → 1
**********************************************/
// #define V (5)
// int g[V][V] = 
// {
//     {0,0,1,1,0},
//     {1,0,0,0,0},
//     {0,1,0,0,0},
//     {0,0,0,0,1},
//     {0,0,0,0,0}
// };#define V (8)
int g[V][V] = 
{ // 0 1 2 3 4 5 6 7  {0,1,0,0,0,0,0,0},{0,0,1,0,0,0,0,0},{1,0,0,0,0,0,0,0},{0,0,0,0,1,0,0,1},{0,0,0,0,0,1,0,0},{1,0,0,0,0,0,1,0},{1,0,1,0,1,0,0,0},{0,0,0,1,0,1,0,0}
};/**********************************************强连通分量 strongly connected component
**********************************************/void tarjan_dfs(int x, int dfn[], int low[], stack<int>& s, bool in_stack[])
{static int time = 1;dfn[x] = low[x] = time++;s.push(x);in_stack[x] = true;for(int y = 0; y < V; y++){if(g[x][y]){if(0 == dfn[y]){tarjan_dfs(y, dfn, low, s, in_stack);low[x] = min(low[x], low[y]);}else if(in_stack[y])low[x] = min(low[x], dfn[y]);}}if(dfn[x] == low[x]){int tmp;do{tmp = s.top(); s.pop();in_stack[tmp] = false;cout<<tmp<<"-";}while(tmp != x);cout<<endl;}
}void scc_tarjan()
{int dfn[V] = {0}, low[V] = {0};bool in_stack[V] = {false};stack<int> s;for(int i = 0; i < V; i++)if(!dfn[i])tarjan_dfs(i, dfn, low, s, in_stack);
}int main()
{scc_tarjan();return 0;
}

参考资料:
https://www.bilibili.com/video/BV19J411J7AZ?p=1&vd_source=63c3682e66febb42e6a271165dd5a13e
https://github.com/xiaoyazi333/data-structure-and-algorithm/

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

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

相关文章

Spring Cloud介绍

一、SpringCloud总体概述 Cloud Foundry Service Broker&#xff1a;通用service集成进入Cloud Foundry Cluster&#xff1a;服务集群 Consul&#xff1a;注册中心 Security&#xff1a;安全认证 Stream&#xff1a;消息队列 Stream App Starters&#xff1a;Spring Cloud Stre…

面试题——JVM老年代空间担保机制(我的想法)

这里借用一下人家的图&#xff0c;来说一下我的想法&#xff0c;嘻嘻。。。。 原文链接&#xff1a;一道面试题&#xff1a;JVM老年代空间担保机制-CSDN博客? 嗯&#xff0c;我觉得老年代担保机制的主要作用就是避免频繁触发FULL GC&#xff0c;这其实也是因为年轻代Minor GC…

自动驾驶_交通标志识别:各目标检测算法评测

自动驾驶|交通标志识别&#xff1a;各目标检测算法评测 论文题目&#xff1a;Evaluation of Deep Neural Networks for traffic sign detection systems 开源代码&#xff1a;https://github.com/aarcosg/traffic-sign-detection 附赠自动驾驶学习资料和量产经验&#xff1a;…

sharo反序列化漏洞

启动docker 服务 sudo service docker start 打开靶场 sudo docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 输入docker虚拟机地址打开靶机sharo框架 如何利用漏洞 打开工具目录在终端中打开 输入靶机地址 打开yaki监听端口可以设置为6666 返回工具填写靶机ip和端口 …

idea开发 java web 高校学籍管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 高校学籍管理系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 css jq…

【STM32】存储器和位带映射(bit band mapping)

文章目录 0 前言1 关于地址和存储器2 STM32内部存储器3 位带映射&#xff08;bit band mapping&#xff09;4 扩展&#xff1a;IAP 0 前言 最近在研究stm32标准库&#xff0c;对使用宏定义实现位操作的函数非常感兴趣&#xff0c;简单的一句PAout(1) 0;就能实现某个引脚电平的…

HTTP协议报文的结构的补充和from表单以及ajax表单

响应 状态码 表示了这次请求对应的响应,是什么样的状态(成功,失败,还是其他的情况.还有及其对应的原因&#xff09; 主要有这些类 成功状态码&#xff1a;其中200最常见&#xff0c;表示成功 重定向状态码&#xff1a;很多时候,页面跳转,就可以通过重定向来实现. 还有的时…

jdk api之AbstractMethodError基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

蓝桥杯算法题:卡片换位

问题描述 你玩过华容道的游戏吗&#xff1f;这是个类似的&#xff0c;但更简单的游戏。 看下面 2 x 3 的格子 --------- | A | * | * | --------- | B | | * | --------- 1 2 3 4 5 在其中放 5 张牌&#xff0c;其中 A 代表关羽&#xff0c;B 代表张飞&#xff0c;* 代表士兵…

SSL协议是什么?有什么作用?

SSL协议是一种让互联网上的数据传输变得更安全的技术。它的主要作用是&#xff1a; 保密性&#xff1a; 使用加密手段&#xff0c;让别人偷看不了你在网上发的信息&#xff08;比如密码、聊天内容、银行卡号等&#xff09;。完整性&#xff1a;防止你的信息在传输途中被偷偷修…

隐私计算实训营学习八:隐语SCQL的开发实践

文章目录 一、SCQL使用集成最佳实践1.1 SCQL使用流程1.2 SCQL部署1.3 SCQL使用示例 二、SCQL工作原理三、使用SecretNote上手体验SCQL 一、SCQL使用集成最佳实践 1.1 SCQL使用流程 SCQL使用&#xff1a; SCQL 开放 API 供⽤户使⽤/集成。可以使⽤SCDBClient上⼿体验(类似与My…

51单片机ESP8266WiFi模块简介

乐鑫与安信可关系 乐鑫是生产esp8266芯片的厂家&#xff0c;安信可是基于esp8266芯片生产模组的厂家&#xff0c;所谓模组是基于芯片制作的套件。 波特率 ESP8266系列模组出厂使用的是AT固件&#xff0c;默认波特率是115200。实际上&#xff0c;模组在上电过程中首先是在748…