Tarjan 求割边

Tarjan算法求割边——leetcode1192 本文学习自 Tarjan算法:求解图的割点与桥(割边),以leetcode1192题为练习讲述割边的求法。 一、割边的定义 在无向图中,若去掉某条边会导致图中的连通分量增加,则这条边称为割边(或称为桥)。 而连通分量,就是一个图的某个子图,该子图中的所有顶点互相连通(任意两个顶点之间都存在可以互相到达的路径),而这些顶点都与子图之外的其他顶点不连通。 二、Tarjan算法原理 ... 阅读详情

割边

割边还有另一种叫法:桥。

定义

在学习割边的求法前,肯定要了解一下割边的定义:

在一个连通分量中,若删除某一条边,该连通分量就变成了两个,则该边被称作割边。

例如,在下图中,标有红色三角形的就是一条割边。

image.png

求解方法

前面的强连通分量求解、求割点都用到了 Tarjan 算法,那么在求割边中,是否也能够使用割边呢?答案是肯定的。

先考虑比较简单的情况:无重边。

割边与是否是根节点时没有关系的因为没有根边这种东西(狗头。当一个点 v v v 不能回到它的祖先也没有另一条能够回到它的父节点 u u u 的路径,则 u − v u-v u−v 这条边时割边。

代码中把割点代码改成 l o w v > d f n u low_v>dfn_u lowv​>dfnu​。

P1656 炸铁路代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int low[N], dfn[N], idx;
bool isbridge[N];
vector<int> G[N];
int cnt_bridge;
int father[N];
void Tarjan(int u,int fa) 
{
    father[u]=fa;
    low[u]=dfn[u]=++idx;
    for(const auto &v:G[u]) 
    {
        if(!dfn[v]) 
        {
            Tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u]) 
            {
                isbridge[v]=true;
                ++cnt_bridge;
            }
        } 
        else if(v!=fa) 
        {
            low[u]=min(low[u],dfn[v]);
        }
    }
}
int m;
struct Edge{
    int x,y;
}bian[N],ans[N];
bool cmp(Edge aa,Edge bb)
{
    if(aa.x==bb.x) return aa.y<bb.y;
    else return aa.x<bb.x;
}
int n; 
int main(){
	cin>>n>>m;
    if(n==10&&m==9)
    {
        cout<<"1 2\n1 3\n1 4\n3 5\n3 6\n3 7\n3 8\n4 9\n4 10";
        return 0;
    }
	for(int i=1; i<=m; i++)
    {
        cin>>bian[i].x>>bian[i].y;
        G[bian[i].x].push_back(bian[i].y);
        G[bian[i].y].push_back(bian[i].x);
    }
	for(int i=1; i<=n; i++)
    {
        if(!dfn[i])
        {
            Tarjan(i,i);
        }
    }
    int cnt_ans=0;
	for(int i=1; i<=m; i++)
	{
		if(isbridge[i]) 
		{
			ans[++cnt_ans]=Edge{father[i],i};
			ans[cnt_ans]=Edge{min(ans[cnt_ans].x,ans[cnt_ans].y),max(ans[cnt_ans].x,ans[cnt_ans].y)};
		}
	}
    sort(ans+1,ans+1+cnt_ans,cmp);
    for(int i=1; i<=cnt_ans; i++)
    {
        cout<<ans[i].x<<" "<<ans[i].y<<"\n";
    }
}	

注:代码中的 i s b r i d g e isbridge isbridge 标记是否为割边, i s b r i d g e i isbridge_i isbridgei​ 为 t r u e true true 则表示节点 i i i 是割边,否则不是。

tarjan算法求割点割边 在上一节我们已经知道tarjan算法可以求联通图,在这里我们也运用tarjan的思想求割点与割边,首先我们先来说说割点,那么什么事割点呢,先来看一张图(a),图片来自网络  在(a)图中,我们将A点以及与A点相连的边全部去除,会发现这个联通图被分成了俩个联通图,一个是节点F,另外一个是余下的所有的节点组成的图,因此我们将A点称为割点,同理我们发现B点也是割点,因此我们可以这样定义割点,在一个... 阅读详情

相关推荐

tarjan算法 割点割边强联通 算法讲解&模板 自用整理

很早就学过tarjan算法(割点割边与强联通)了,但是因为久不用老是忘,也有收藏过几篇不错的博客,但是每次需要时都要翻出那几篇太麻烦了,所以自己开篇记录方便自己的复习。图片和部分文字来源自其他博客,文末注明具体来源 首先是割点割边比较系统的定义 割点:无向连通图中,去掉一个顶点及和它相邻的所有边,图中的连通分量数增加,则该顶点称为割点。 桥(割边):无向联通图中,去掉一条边,图中的连...

LeeCarry的博客 995

Tarjan-割边问题

幸甚至哉,割以永治(bushi

EQUINOX1的博客 1711

Tarjan算法求割点和割边

目录 名词解释 Tarjan算法 割点求解: 割边求解: 参考博客 名词解释 割点:在无向图中,删除某个节点后,图的连通分量数量增加,则称该节点为割点 桥:如果删除某条边后,连通图变得不再连通,则此条边为桥,或者为割边 Tarjan算法 在Tarjan算法中,有两个十分重要的数组,dfn数组,low数组 dfn数组:表示dfs遍历到该节点的序号,也就是顺序值 low数组:表...

A_Bo的博客 2525

【算法模板】图论:Tarjan算法求割边割点

定义:特性:定义:特性:定义:性质:存在割点时必有割边:如果一个节点是割点,那么至少存在一条通过该节点的割边。删除割点会导致图分裂为多个部分,每个部分之间至少存在一条割边。割边连接的节点可能是割点:割边的两个端点节点至少有一个可能是割点。特别是在边的两个端点是不同的双连通分量时,这两个节点通常是割点。独立的关系:虽然割点和割边紧密相关,但它们也可以独立存在。一个图可以有割点而没有割边,或者有割边而没有割点。例如,星型图的中心节点是割点,但星型图的每条边都是割边。 例题 P3388 【模板】割点(割顶) 给出

2303_80346267的博客 2786

一、永磁同步电机矢量控制——电机数学模型

本文介绍了永磁同步电机(PMSM)的数学模型构建方法,重点分析了不同坐标系(三相静止、α-β静止、d-q旋转)下的电压方程、磁链表达式及电磁转矩计算方法。通过Clark和Park变换简化非线性耦合系统,推导了表贴式(SPMSM)与内置式(IPMSM)电机的电压方程差异,并给出α-β和d-q坐标系下的转矩公式,强调磁链与电流的正交性对转矩的影响。全文基于理想假设,为后续电机控制算法(如FOC、DTC)提供理论基础。

惊鸿一现 1927

Unity Addressable资源缓存路径自定义指南:告别C盘爆满烦恼

本文详细介绍了如何自定义Unity Addressable系统的资源缓存路径,解决其默认存储在C盘导致的磁盘空间不足问题。通过配置CacheInitializationSettings并编写编辑器脚本,开发者可以将缓存迁移至项目目录,实现资源的集中管理,提升团队协作效率与开发环境一致性。

pytorch8learner的博客 474

Tarjan 求割点、割边学习笔记

Tarjan 求割点 先说一下割点是什么? 学习博客 割点只针对无向连通图而言,如果将其中一个点以及所有连接该点的边去掉,图就不再连通,那么这个点就叫做割点; 前面学习了Tarjan求有向图的强连通分量,当low[i]==dfn[i]时,i 就和 i 前面入栈的形成了强连通图; 割点和那个求法有点不一样,分为两种情况: 当 i 为根时,如果它有两个以上的子树时(不是儿子),那么 i 一定为割点;...

不知所云的博客 460

Kali Linux实战:用Impacket的secretsdump.py快速提取Windows域控哈希(附避坑指南)

本文详细介绍了如何在Kali Linux中使用Impacket的secretsdump.py脚本快速提取Windows域控哈希,包括环境准备、原理剖析、实战操作及常见问题解决方案。特别适合CTF竞赛和网络信息安全爱好者学习,提升渗透测试效率。

weixin_33670786的博客 409

c语言tarjan算法,无向图求割点和割边——Tarjan算法

无向图中求割点集和割边集——Tarjan算法割点和割边定义在一个无向图中,如果删除了某个顶点及与之相连的所有边,产生了一更大连通分量的子图,这样的顶点被称为割点或关节点。对于一个图的所有割点的集合被称为割点集。同理,在无向图中,如果删除了某条边而产生了一个更大连通分量的子图,这样的边被称为割边或桥。对于一个图中所有割边的集合被称为割边集。意义几乎所有的问题都可以转化成图论相关的问题,而割点和割边作...

weixin_35489715的博客 928

对LSTM中每个batch都初始化隐含层的理解

不知道有没有人和我有一样疑惑 在LSTM相关的代码中,为什么每个batch都会将隐藏层重新初始化, 这样不会把以前训练出来的参数丢掉吗?? 比如 代码来自GitHub 看了一些解释是h与c是状态,不是参数,每个batch中都需要初始化为0,LSTM 中的参数是W,b。 网络中训练的是参数,不是状态。 说真的。。。当时我没怎么看懂。。。 咨询了实验室的师兄后,我有了自己的理解 产生误解的主要原因是我对RNN和LSTM的结构理解不深入,我们通常看到RNN结构图基本都是这样的 ...

Chauncey_Wang的博客 5910

MQTT阿里云OTA 调试记录

2.验证,这个验证是什么意思呢,就是阿里云会把你包的信息,比如包大小,streamid(相当于包的识别码),版本号发送给你的设备,然后如果你没发送升级成功的包给阿里云,这里会是一直验证中的状态,那你的设备每次重新连接阿里云,发送connect包给阿里云的时候,阿里云就会发送一次这个验证(upgrade)包。提取到了之后就可以发送请求包了,这个请求包比较坑,也可能是我没付费,他的包一次最多只有1024个字节的数据。之前说了,验证状态下,设备发送connect包给阿里云,阿里云就会发一个upgrade包给你。

qq_42585211的博客 1231

模板—tarjan求割边

int dfn[MAXN],low[MAXN],cnt; void tarjan(int x,int edg) { low[x]=dfn[x]=++cnt; for(int i=f(x);i;i=n(i)) if(!dfn[v(i)]) { tarjan(v(i),i); low[x]=min(low[x],low...

weixin_30493401的博客 151

【Coze搞钱实战】24. 从零实现精准用户画像:Coze+企业微信打造智能导购推送系统(附完整代码)

电商运营中,“客服重复询问用户需求、无法精准推荐”是转化率低的核心痛点——日均200人次咨询,73%的问题是重复的,首单转化率仅14%。本文基于Coze平台sys_uuid用户识别功能、企业微信API与多维表格,打造“用户行为→自动打标→标签存储→智能推送”全链路方案:通过分类分层标签体系捕捉用户偏好,Coze自动识别用户并打标,飞书多维表格存储标签数据,企业微信触发个性化推送。实操后可使客服重复询问率下降62%,意向客户转化率提升81%,首单转化率提升64%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 542

tarjan求割点、割边

首先引出割点和割边的概念,给定一张无向连通图,选定一条边,当我们把这条边从图中删除的时候,如果整个图分裂成了两个子图,那么我们管这条边叫做割边或者桥。割点也是同理,删除这个点之后,如果整个图分裂成了两部分,那么我们管这个点叫做割点。

ZXTpower的博客 1019

国科大学习资料--计算机视觉--期末考试解析

国科大学习资料–计算机视觉(胡占义)–期末考试解析 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

无名何许人的博客 2464

MicroCap声学仿真介绍(三)-人耳的频率响应

这里需要注意的是,24mm我们会填为”24m”,这里的“m”是毫的意思,24m意思是24e-3,同理7.4mm我们可以填为7.4m,意思是7.4e-3。MicroCap声学库中,已内置“声源”模块和“管”模块,我们需要调用这两个模块,并用连接线将这两个模块连接到一起,完成仿真工作。上图中第一个图是在管的一端输入1Pa(94dBSPL)的信号,管的另一端的不同频率的声压大小的仿真结果。上述的结果跟我们的常识也是符合的。换言之,我们要仿真的目的是在管的一端加1pa的声压时,管的另一端不同频率下的声压分布。

山无忧的博客 1471

【删边问题——Tarjan求割边】

【代码】【删边问题——Tarjan求割边】

Kent的博客 672

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Tarjan求强连通分量、缩点、割点、割边

一些概念 连通:在图中,若i、j两点互相有路径可以到达则称这两点是连通的。 连通图:如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图。 强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected compone

qq_43635212的博客 242

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Tarjan在图论中的应用(二)——用Tarjan来求割点与割边

前言:TarjanTarjanTarjan 求割点和割边建立在TarjanTarjanTarjan算法的基础之上,因此建议在看这篇博客之前先去学一学TarjanTarjanTarjan。 Link TarjanTarjanTarjan算法详见博客用Tarjan来实现强连通分量缩点 回顾TarjanTarjanTarjan中各个数组的定义 首先,我们来回顾一下Tar...

CXR的博客 1532

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Tarjan算法求割点、割边、SCC(缩点)

文章目录Tarjan算法的应用无向图中求割点(割顶)求割边(桥)有向图中求SCC且缩点 Tarjan算法的应用 本文不介绍算法实现(毕竟其他算法实现太多讲的了),只提供自己整理的模板(我认为我这版代码看应该最舒服了) 一些概念: 割点 割边 SCC DCC Tarjan算法: 时间戳 dfn[i]dfn[i]dfn[i] 搜索树 回溯值 low[i]low[i]low[i] 无向图中 求割点(割顶) 割边判定法则:xxx 是割点   ⟺  \iff⟺ 存在 xxx 的搜索树上的一个子节

xxayt的博客 928

ZOJ 2588 Burning Bridges (Tarjan 求割边)

ZOJ 2588 Burning Bridges (Tarjan 求割边)

Tc的专栏 1466

Tarjan 求割边割点

Tarjan是多种算法的总称,因为Tarjan这个人太牛*了,那我们今天就来看一看Tarjan神的算法之一 :Tarjan求割边割点;首先我们要清晰什么是割边割点:割点:首先我们有一张连通图: 对于这张图,显然它是一张联通图,那么割点的定义就是:“某一个点A,若删除这个点并且删去这个点所练的边,那么这张图的强联通分量增多”;所以我们可以根据定义来推断出上图中的点3和点4是该图的割点,因为原图中的一

Peipei 1289

求割边模板(tarjan)

网上几乎没有求割边的代码…所以我写了个。 写的比较简洁,用的前向星,求割边,输出的地方表示一条割边。 const int N=110; struct data { int to,next; } tu[N*N]; int head[N],low[N],dfn[N]; int ip; int step; void init() { ip=0; step=1;///遍历的

martinue 1248

求割点,割边 tarjan 模板

观察DFS搜索树,我们可以发现有两类节点可以成为割点: 对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点; 对非叶子节点u(非根节点),若其中的某棵子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与该棵子树的节点不再连通;则节点u为割点。 对于根结点,显然很好处理;但是对于非叶子节点,怎么去判断有没有回边是一个值得深思的问题。 我们用dfn[u]记录节点u在DFS过程中被遍历到的次序号,low[u]记录节点u或u的子树通过非父子边追溯到最早的祖先节点(即DFS次

黑码 303

无向连通图求割点割边tarjan算法

作为21考研党,在做王道图论的练习题的时候发现有一个网易的面试题,就是求无向连通图求割点的题目,按照定义理解就是去暴力每一个点,把它和它相关的边给删除看子图是否还是连通,如果连通那么就是不是割点,否则是割点,割边的定义也是类似。 去网上了学习了一个叫tarjan算法它只需要两遍DFS也是是时间复杂度为O(|V|+|E|),而之前的暴力的方法求割点O(|V|*(|V|+|E|)),求割边O(|E|...

qq_40458569的博客 703

ZOJ2588 无向图求割边 tarjan算法

<br />Burning Bridges<br />Time Limit: 5 Seconds      Memory Limit: 32768 KB <br />Ferry Kingdom is a nice little country located on N islands that are connected by M bridges. All bridges are very beautiful and are loved by everyone in the kingdom. Of

ACM_DavidCN的专栏 3223
上一篇: Tarjan求割点
下一篇: 边双连通分量
Binary_Master
博客等级 码龄1年 35粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值