【图论】Tarjan算法(强连通分量)

news2024/9/21 2:35:02

一、Tarjan算法简介

Tarjan算法是一种由美国计算机科学家罗伯特·塔杨(Robert Tarjan)提出的求解有向图强连通分量的线性时间的算法。

二、强连通分量的概念

在有向图 G G G 中,如果任意两个不同的顶点相互可达,则称该有向图是强连通的。
如图1所示,图“郓城武安张”就是一个强连通图。
图1
图1

如果在强连通图 G G G 中进行加边操作得到有向图 G ′ G' G,那么我们称原图 G G G G ′ G' G 的一个强连通分量。
如图2所示,图“郓城武安张”、图“同”和图“学”都是图“郓城武安张同学”的一个强连通分量。
图2
图2

三、初识Tarjan算法

Tarjan算法本质上是基于深度优先搜索的一种算法。
在使用Tarjan算法时,需要用到两个辅助数组:
d n f x dnf_x dnfx:记录每个点被发现时的时刻。
l o w x low_x lowx:表示以顶点x为根的子树中所有顶连出的边能到达的最早的能到达x的顶。
通俗一点,对于图2中的图,为了应对汉字无法作为下标的问题,我们简化一下,得到下面的图3。
图3
图3

假定 1 1 1 号结点为搜索起点,那么我们将有:

  • d n f i = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } dnf_i=\{1,2,3,4,5,6,7\} dnfi={1,2,3,4,5,6,7}
  • l o w i = { 1 , 1 , 1 , 1 , 1 , 6 , 7 } low_i=\{1,1,1,1,1,6,7\} lowi={1,1,1,1,1,6,7}

如果对上面的描述有疑惑,请往下看。

四、模拟Tarjan算法

我们继续看上面的图3,并对它进行模拟(假定 1 1 1 号结点为搜索起点),深入地了解Tarjan算法。
为了帮助理解,求图3中的有向图以 1 1 1 号结点为根的最小生成树,如图4。
图4
图4

会发现,这棵树是一条链的结构。

  1. 初始化: d n f i = 0 dnf_i=0 dnfi=0,对于每一步, l o w i = d n f i low_i=dnf_i lowi=dnfi
  2. 1 1 1 号结点进入程序,并将其入栈,将 d n f 1 dnf_1 dnf1 的值赋为 1 1 1
    栈: 1 1 1
  3. 1 1 1 号结点可以直接到达 2 2 2 号结点,且 d n f 2 = 0 dnf_2=0 dnf2=0,将 2 2 2 号结点入栈,并将将 d n f 2 dnf_2 dnf2 的值赋为 2 2 2
    栈: 1   2 1~2 1 2
  4. 2 2 2 号结点可以直接到达 3 3 3 号结点,且 d n f 3 = 0 dnf_3=0 dnf3=0,将 3 3 3 号结点入栈,并将将 d n f 3 dnf_3 dnf3 的值赋为 3 3 3
    栈: 1   2   3 1~2~3 1 2 3
  5. 3 3 3 号结点可以直接到达 4 4 4 号结点,且 d n f 4 = 0 dnf_4=0 dnf4=0,将 4 4 4 号结点入栈,并将将 d n f 4 dnf_4 dnf4 的值赋为 4 4 4
    栈: 1   2   3   4 1~2~3~4 1 2 3 4
  6. 4 4 4 号结点可以直接到达 5 5 5 号结点,且 d n f 5 = 0 dnf_5=0 dnf5=0,将 5 5 5 号结点入栈,并将将 d n f 5 dnf_5 dnf5 的值赋为 5 5 5;(注意啦,下一步是重点!)
    栈: 1   2   3   4   5 1~2~3~4~5 1 2 3 4 5
  7. 5 5 5 号结点可以直接到达 1 1 1 号和 6 6 6 号两个结点,按字典序先遍历 1 1 1 号结点,因为 d n f 1 = 1 ≠ 0 dnf_1=1\neq0 dnf1=1=0,此时我们需要进行出栈操作;
    栈: 1   2   3   4   5 1~2~3~4~5 1 2 3 4 5
  8. 将栈顶 l o w 5 low_5 low5 的值赋值为 min ⁡ ( l o w 5 , d n f 1 ) = 1 \min(low_5,dnf_1)=1 min(low5,dnf1)=1,并将 5 5 5 出栈,将栈顶 l o w 4 low_4 low4 的值赋值为 min ⁡ ( l o w 4 , d n f 5 ) = 1 \min(low_4,dnf_5)=1 min(low4,dnf5)=1,并将 4 4 4 出栈;
  9. 依此类推,直至 1 1 1 被出栈;
    栈:空
  10. 5 5 5 号结点继续往下搜索, 5 5 5 号结点可以直接到达 6 6 6 号结点,且 d n f 6 = 0 dnf_6=0 dnf6=0,将 6 6 6 号结点入栈,并将将 d n f 6 dnf_6 dnf6 的值赋为 6 6 6
    栈: 6 6 6
  11. 6 6 6 号结点可以直接到达 7 7 7 号结点,且 d n f 7 = 0 dnf_7=0 dnf7=0,将 7 7 7 号结点入栈,并将将 d n f 7 dnf_7 dnf7 的值赋为 7 7 7
    栈: 6   7 6~7 6 7
  12. 7 7 7 号结点没有可以直接到达的结点,回溯(回溯过程省略);
    栈: 6   7 6~7 6 7
  13. 此时,整个图都已经被搜索完毕,但是栈中仍存在原神元素,说明栈中剩余的每个结点都自成一个强连通分量,我们只需依次出栈即可。
    栈:空
  14. 最终得到第三部分所提及的两个数组。

代码:

int step;
stack<int>st;
int dnf[300006],low[300006];
bool in_st[300006];
void tarjan(int x){
	int tmp;
	step++;
    dnf[x]=low[x]=step;
    st.push(u);
    in_st[x]=1;
    for(int i=head[x];i!=-1;i=nxt[i]){
        tmp=e[i];
        if(!dnf[tmp]){
            tarjan(tmp);
            low[x]=min(low[x],low[tmp]);
        }
        else if(in_st[tmp])low[x]=min(low[x],dnf[tmp]);
    }
    if(low[x]==dnf[x]){
        do{
            tmp=st.top();
            st.pop();
            in_st[tmp]=0;
        }while(tmp!=x);
    }
    return;
}

如果博客有错误,请联系我,我会尽快修正!压力马斯内!

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

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

相关文章

平价电容笔排行榜:2024开学季五大高人气电容笔测评推荐 !

随着开学季的到来&#xff0c;无纸化学习再次成为热议话题&#xff0c;而电容笔作为支持这一趋势的重要配件&#xff0c;自然也备受瞩目。面对市场上琳琅满目的品牌选择&#xff0c;找到最适合自己需求的那一款就成了一个不小的挑战。不用担心&#xff0c;作为一名资深的数码产…

基于FPGA的SD NAND Flash数据读写实现

1、存储芯片分类 目前市面上的存储芯片&#xff0c;大致可以将其分为3大类&#xff1a; ① EEPROM EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器&#xff0c;是一种掉电后数据不丢失的存储芯片。EEPROM 可以在电脑上或专用设备…

【初阶数据结构】复杂度

b站复杂度链接 另一个复杂度链接 复杂度笔记

利用大型语言模型协作提升甲状腺结节超声诊断的一致性和准确性| 文献速递-基于深度学习的癌症风险预测与疾病预后应用

Title 题目 Collaborative Enhancement of Consistency and Accuracy in US Diagnosis of Thyroid Nodules Using Large Language Models 利用大型语言模型协作提升甲状腺结节超声诊断的一致性和准确性 Background 背景 Large language models (LLMs) hold substantial …

git仓库删除某个历史提交

目录 问题情况1情况2 问题 如果我们在开发过程中&#xff0c;存在一些验证性的提交或者失误性的提交&#xff0c;那么这些提交我们不想要了&#xff0c;怎么办&#xff1f; 情况1 如果是想要删除某个commitid之后的所有提交 那么git reset 可以满足你 git reset --hard 你要…

2001-2023年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线等300+个关键词)

2001-2023年上市公司数字化转型年报词频统计&#xff08;吴非、赵宸宇、甄红线&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、参考文献&#xff1a;企业数字化转型与资本市场表现——来自股票流动性的经验证据&#xff08;吴非&#xff…

电脑浏览器打不开部分网页

电脑浏览器打不开部分网页 时间: 2024-08-25 问题描述: 电脑突然打不开部分网页 例如腾讯文档 夸克网盘 但其他网页能够正常打开 原因 可能为域名解析问题 更改DNS即可解决 解决办法 控制面板–> 网络和Internet—>网络连接—> WLAN----> 属性 —> Interne…

spring security怎么生成JWT返回前端,以及怎么自定义JWT认证过滤器

怎么生成JWT返回前端 1.先写一个类,里面含有jwt的生成解析验证过期时间的方法 package com.lzy.util;import io.jsonwebtoken.*; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.…

7-6 分段函数2

计算分段函数&#xff0c;测试数据分别是-1、5、12。 输入格式: 输入一个数。 输出格式: 直接输出保留6位小数的结果&#xff0c;没有其它任何附加字符&#xff0c;没有宽度控制。 输入样例: 11输出样例: 0.999912输入样例: 7输出样例: 8.000000 #include <stdio.h…

单片机裸机程序——程序架构

目 录 程序架构等同于思想体系一、前后台顺序法二、时间片轮询法 程序架构等同于思想体系 建一栋楼房&#xff0c;地基要先设计好&#xff0c;而不是马上砌砖&#xff0c;地基和布局都合理&#xff0c;房子就住得舒服&#xff0c;也不会闹心。 写一段程序也一样&#xff0c;程…

c++,python实现网络爬虫

前言&#xff1a; 社交网络中用户生成的海量数据&#xff0c;社交网络数据的多样性和复杂性 如何高效地从海量的数据中获取和处理我们需要的信息资源&#xff1f; 该微博爬虫能够从社交网络平台中地提取文本、图片和用户之间的转发关系&#xff0c;并将这些数据结构化存储到…

Python的Windows GUI自动化之Pywinauto(四)

引言&#xff1a; 我们上章节中打开了一个应用程序后&#xff0c;并打印了所有的控件信息&#xff0c;这些对于工具无法定位到的控件有很好的协助作用&#xff08;当然这个可以作为主要的查找控件的用法&#xff0c;也可以辅助使用&#xff0c;我一般是把这个作为辅助使用&…

【C++】初识C++模板与STL

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理 本章将简单分享C模板与STL相关知识&#xff0c;与之相关更多知识将留到下次更详细地来分享给大家 &#x1f3…

MySQL与ES数据实时同步,双写一致

一、简介 在项目的开发与运维过程中&#xff0c;MySQL 是业务数据库的核心角色&#xff0c;以其强大的事务处理能力和数据完整性保障&#xff0c;支撑着系统的稳定运行。随着数据量的急剧增长和查询复杂度的不断提升&#xff0c;单一依赖 MySQL 进行高效的数据检索显得日益吃力…

centos安装软件

1.centos 安装 unrar 提示找不到 使用EPEL仓库&#xff1a; 首先&#xff0c;你需要安装EPEL仓库&#xff1a; yum install epel-release 然后&#xff0c;尝试再次安装unrar&#xff1a; yum install unrar 编译安装&#xff1a; 下载源代码&#xff1a;wget http://www.rarla…

对耳朵伤害最小的耳机类型是哪种?五款口碑绝佳机型安利!

​目前来说&#xff0c;开放式耳机应该算是对耳朵伤害最小的耳机了。当今耳机市场上&#xff0c;开放式耳机以其舒适的佩戴和创新的非入耳设计赢得了众多消费者的喜爱。这种耳机让你在聆听音乐的同时&#xff0c;还能清晰地感知周围环境的声音&#xff0c;便于与人交流&#xf…

clickhouse 原理详解

1、MPP数据库简介 1.1、什么是OLTP与OLAP&#xff1f; 1.1.1、OLTP(OnLine Transaction Processing ) 联机事务处理 系统&#xff0c;例如mysql。擅长事务处理&#xff0c;在数据操作中保持着很强的一致性和原子性 &#xff0c;能够很好的支持频繁的数据插入和修改 &#x…

Java使用Tesseract进行OCR图片文字识别

前言 在当前的文字识别技术应用中&#xff0c;除了采用现有的API服务之外&#xff0c;常见的解决方案包括利用Tessdata、Canvas或OCRAD等工具。以下是对几种技术的简要分析&#xff1a; 百度API的使用体验表明&#xff0c;虽然其识别率令人满意&#xff0c;但并非完美无误。此…

一个月狂撸5.8W,利用AI制作宝宝走秀视频,让宝宝“出海”捞美刀

今天给大家分享的项目是**AI宝宝走秀视频玩法&#xff0c;**在项目拆解之前&#xff0c;先看一下这个账号。这个账号是在Tiktok上的&#xff0c;也就是海外版的抖音。 基本上都是几千万的播放&#xff0c;按照海外版抖音的激励计划&#xff0c;每播放一万次&#xff0c;就能赚8…

紧跟大模型技术趋势,为更大更通用的大模型提供底层支撑!关于智能计算系统:从深度学习到大模型,全新版本,发布!

文章目录 &#x1f4cb;前言&#x1f3af; 关于智能计算系统&#x1f3af; 内容简介&#x1f3af; 作者简介&#x1f3af; 专家推荐&#x1f3af; 目录大纲&#x1f525; 参与方式 &#x1f4cb;前言 “只要你想把大模型做得更好、做得更大、做得更快、做得更省电&#xff0c;…