2017.10.29闵神讲课DAY2(tarjan)

2023-10-10 02:59

本文主要是介绍2017.10.29闵神讲课DAY2(tarjan),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

tarjan算法

tarjan可以用来求无向图的割点 割边 或有向图的强连通分量


求割点 割边

那么什么是割点割边呢?
割点:在一个无向连通图中,如果去掉这个点以及连向它的边,那么这个图不再连通,那么这个点就是割点
割边:如果去掉某一条边之后,联通分量的数目变多,那么这个点就是割边

用最暴力的方法当然可以求 即给每个点打上标记去枚举 跑一遍dfs即可 但是时间复杂度很不优秀
用tarjan算法可以在O(n+m)求完所有的割点 割边 时间复杂度十分优秀

首先我们要先建一颗dfs树

举个例子:

dfs树

割边

用low数组来记录dfs中每个点沿着除了父亲之外的所有点能访问到的最小dfn值

我们设x为y的父亲节点

那么如果low[y]<=dfn[x]就是(x,y)不是割边的必要条件(仔细思考一下)
那么我们只要求出low数组即可

那么怎么求low数组和dfs值呢??

伪代码:

dfn[],low[]
tot;
void dfs(int x,edge e)
{dfn[x]=low[x]=++tot;for((x,y)∈E&&(y,x)!=e)if(!dfn[y]){ dfs(y,(x,y))if(low[y]<low[x]) low[x]=low[y];}else if(dfn[y]<low[x])low[x]=dfn[y];
}

割点

那么怎么求割点呢??
思考一下割边连接的两个点一定都是割点吗???

并不是 并不是!

叶子节点呢??不是莫大了

那么割边连接的两个点除了叶子节点都是割点吗??

好像是的 没错就是这样

如果设割边的集合为A 割点的集合为B
我们不能说A=B 因为还有其他重边的情况
也就是说割点不一定与割边相连
但是我们可以说A⊇B
那么我们来思考一下如何求割点呢???

其实差不了太多

就是要判断(x,y)是否存在low[y]>=dfn[x]

即对于任意一个x,如果存在(x,y)∈E y∈x son
low[y]>=dfn[x]
则x是割点

思考一下上面的话有漏洞吗??
如果x是根节点呢 那不就GG

但是如果根节点的子树个数>=2的话 根节点还是一个割点
因此我们要加一个判断
(son>=2||(son==1&&x!=root))
其他的代码与割边类似 就不在给出了


强连通分量

这时还要记录dfn 和 low
但此时的low数组就没有限制了(不需要不能经过父节点)

此时我们就可以设计算法了,dfs访问到x时,将x加入栈中,对于x出边指向的点y:1.若y未被访问过,递归访问y之后用low[y]更新low[x],2.若y被访问过且y在栈中,那么用dfn[y]更新low[x]。在递归结束如果dfn[x]==low[x],将x及之后的点弹出栈,标记它们属于同一个强连通分量。

大致代码如下:

int tot,bel[MAXV+D];//tot代表强连通分量总数,bel数组代表点属于第几个连通分量
int dfn[MAX+D],low[MAXV+D],ind=0;
int stack[MAXV+D],top;
bool ins[MAXV+D];
void tarjan(int x)

这篇关于2017.10.29闵神讲课DAY2(tarjan)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177458

相关文章

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

Java预备知识 - day2

1.IDEA的简单使用与介绍 1.1 IDEA的项目工程介绍 Day2_0904:项目名称 E:\0_code\Day2_0904:表示当前项目所在路径 .idea:idea软件自动生成的文件夹,最好不要动 src:src==sourse→源,我们的源代码就放在这个文件夹之内 Day2_0904.iml:也是自动生成的文件,不要动 External Libraries:外部库 我这

基于Python的机器学习系列(29):前馈神经网络

在本篇文章中,我们将学习如何使用PyTorch构建和训练一个前馈神经网络。我们将以线性回归为例,逐步了解PyTorch的各个组件及其在神经网络中的应用。这些步骤包括: 指定输入和目标:我们将定义输入特征和目标变量。数据集和数据加载器:使用PyTorch的数据集和数据加载器来管理和加载数据。nn.Linear(全连接层):创建前馈神经网络中的线性层。定义损失函数:选择合适的损失函数

『功能项目』Unity本地数据库读取进入游戏【29】

本章项目成果展示 打开上一篇28Unity连接读取本地数据库的项目, 本章要做的事情是通过读取本地数据库登录进入游戏场景 首先创建一个脚本文件夹: 新建脚本:MySqlAccess.cs 编写脚本:MySqlAccess.cs using UnityEngine;using MySql.Data.MySqlClient;public class MySq

leetcode解题思路分析(五)29-36题

两数相除 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 本题思路倒是不难,既然不能用乘除法和mod,那使用减法是理所当然的,唯一需要考虑的是边界溢出情况 class Solution {public:int divide(int dividend, in

【为项目做准备】Linux操作系统day2

这两天学校的事情总压着,day2拖了好几天..day2内容是进程数据结构 进程数据结构信号处理任务状态进程调度运行统计信息进程亲缘关系进程权限用户和组标识符(IDs)linux capabilities 内存管理文件与文件系统用户态与内核态用户态与内核态的转换函数调用栈内核栈和task_struct的关系 进程数据结构 进程or线程,在内核中,统一叫任务(Task),由一个统

9/29学习总结

周六上午开了总结会,感觉到自己太颓废了相较于别人的努力发现自己和每个人的差距都实在是太大,总结的时候说不出几句,而听到他人的总结时有多多少少能在自己身上找到这些点这点说明反思的还不够并不能抓住问题的要点。近期自己的学习只是看那些基础的题目一点新的知识都没有整天就感觉自己空空的没有东西可以总结,这也反映出看题目也没有看得很深没有将其中的思想给提取出来。对于那些和其他知识点结和的题目我也是跳过而这我想

Android智能家居实训day2

设置使用的布局文件 setContentView(R.layout.filename);,之后使用布局嵌套,一个布局内部可以嵌套另一个布局,内部的布局相当于外部布局的一个子控件,可以把它当作一个整体来操作,例如在今天的八宫格使用布局嵌套的时候,每一个格子是一个线性布局布局内使用垂直方向,而每两个布局作为一行,一共四行,这样就再拿一个布局框起来使用水平方向最后再把这四个布局用垂直方向。在布局之间分配

【智能制造-29】软限位和硬限位

什么是软硬件限位? 在很多运动控制领域都可能会用到软硬限位,比如: 一、工业机器人 软限位应用 工业机器人在进行复杂的动作编程时,通常会设置软限位来确保机器人的运动在安全范围内。通过软件算法对机器人各个关节的运动角度、位置和速度进行限制。例如,当机器人的手臂接近工作空间的边缘或者可能与其他设备发生碰撞的位置时,软限位可以使机器人自动减速或停止运动。 软限位的设置可以根据不同的任务需求进行灵活调

29个阿里架构师必会的核心实战知识点整理清单

29个阿里架构师必会的核心实战知识点整理清单 Java高级架构n 2019-06-24 09:00:00 由于每篇的细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有各种细化讲解内容! JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没