首页 > 其他分享 >无向图Tarjan浅谈

无向图Tarjan浅谈

时间:2023-06-17 22:34:37浏览次数:58  
标签:Tarjan 遍历 浅谈 割点 subtree 无向 证毕 low 非树边

Note Tarjan

Part 1 怎么做

自己看书

Part 2 为什么是对的

证明:搜索树是一棵树

由于每个节点都只会访问一次,回溯一次,故会访问(n-1)*2条边,只取访问时的边,即n-1条,可以构成树

证毕。

证明:在一个简单环上的一条边不可能是桥

如果破除这条边,只能把环断成链,不会损坏连通性。

证毕。

证明:桥一定在搜索树上

由上,在一个简单环上的一条边不可能是桥

那么,一个不在搜索树上的一条边,一定与搜索树上的某些边构成简单环。

则它一定不可能是桥。

证毕。

理解:low到底是什么东西?

可以说,low[x]就是从subtree(x)中出发,在只经过一条非树边的情况下,可以到达的最早被访问的点

也就是说:
如果low[x]==dfn[x],就是说subtree(x)只有一条与外界相连的边,即edge(fa(x),x)

如果low[x]<dfn[x],则必然通过非树边可以到达更早访问的节点,他们不在subtree(x)中。

若low[x]>dfn[x],不可能,这不符合定义。

证明:不可能通过一条非树边(x,y)到达dfn[y]>dfn[x]的点y且y不在subtree(x)中

设若可以通过非树边到达满足如上条件的节点y

考虑dfs的遍历过程,可知y一定比x后遍历到,那么有两种情况:

  1. 是从边(x,y)遍历到y的
  2. 是从某个x,y的公共祖先遍历而来,即先遍历了x子树,再遍历了y子树

对于第一种情况,则边(x,y)是树边,与假设矛盾。

对于第二种情况,则在遍历x时y尚未遍历,而如果存在边(x,y),就一定会从x到y,那么与假设矛盾;否则,就不存在边(x,y),与假设矛盾。

证毕。

通过如上推理,我们就可以理解为什么需要low数组。并且也给接下来的割边和割点的判定法则的证明提供必要条件。

证明:割点判定法则

由定义可知,如果存在满足条件的节点y,也就是说从subtree(y)中出发只能到达x,不能到达更早的点,由上证明知道,如果不能到达更早的点,则能到达的更晚的点都在subtree(y)中。

那么删除x,剩下的图和subtree(y)就形成了分离的联通块。

然而,如果x为根节点,就有可能不存在“剩下的图”,所以需要至少两个满足的子节点y1,y2。

证毕。

理解:关于重边处理

对于寻找割边的tarjan算法,如果存在重边,则肯定不是割边,换言之,只会有重边中的1条成为搜索树的树边,而其他的必然成环。

对于寻找割点的tarjan算法,由于判定法则可以去等,这意味着即使回到割点x也不影响其成为割点,因为割点的定义就是删除与之相连的所有边。

Part 3 怎么想到这样做

以求割边为例,该问题如果使用暴力解决,则可以枚举树边(如上所证,桥一定是树边),再使用DFS判定连通性。

那么对于tarjan算法,可以拆分成为两个部分:

  1. 树形DP
  2. 利用树边判定:

理解方式1: 利用非树边形成环,判定在环上的边不可能是桥(如上证明,环上的边不可能是桥)

理解方式2: 利用非树边返祖(如上证明,利用非树边不可能到达非子树内的非祖先节点),判定子树内有点能返祖的就不是桥

故此优化。

此外,还可以通过树上差分的方式:

  1. 先按照tarjan的方式进行遍历,当找到一条非树边,就比较两端点的时间戳,按树上差分进行
  2. 计算子树和,没有被覆盖的边即答案

标签:Tarjan,遍历,浅谈,割点,subtree,无向,证毕,low,非树边
From: https://www.cnblogs.com/haozexu/p/17488382.html

相关文章

  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节点,个数还要加\(1\)。示例程序1(C++11,POJ不支持):#include<bits/stdc++.h>......
  • P2860 [USACO06JAN]Redundant Paths G 题解 tarjan边双连通分量
    题目链接:https://www.luogu.com.cn/problem/P2860题目大意:给定一个无向连通图,求至少加几条边,能使其变成一个边双连通图。解题思路:边双连通分量缩点后计算度数为\(1\)的节点个数,假设有\(cnt\)个,则答案为\((cnt+1)/2\)。示例程序:#include<bits/stdc++.h>usingnamespacestd;......
  • CF402E Strictly Positive Matrix 题解 tarjan强连通分量
    题目链接:http://codeforces.com/problemset/problem/402/E题目大意:给出一个矩阵\(A\),问是否存在一个正整数\(k\)使得\(A^k\)解题思路:根据矩阵的性质,\(A^k_{i,j}\gt0\)当且仅当\(i\)到\(j\)所以可以把矩阵转成图论模型,若\(A_{i,j}\gt0\),则从\(i\)往\(j\)如果所有点......
  • 浅谈C语言指针的运用(函数与指针、数组与指针)
    1.函数与指针一个函数在编译以后会占用一定的内存,在c语言中函数一般是在栈里面,而函数名就是函数在栈中的首地址。那么接下来会讲解如何通过指针调用函数呢?用指针调用函数我们称为函数指针,指针作为一种数据类型,它指向或引用内存中的数据,那么指针同样可以用来存储函数地址(起始地址......
  • 浅谈 .NET 中的对象引用、非托管指针和托管指针
    目录前言一、对象引用二、值传递和引用传递三、初识托管指针和非托管指针四、非托管指针1、非托管指针不能指向对象引用2、类成员指针五、托管指针 前言#本文主要是以C#为例介绍.NET中的三种指针类型(本文不包含对于函数指针的介绍):对象引用、非托管指针、......
  • 浅谈 thinkphp composer 扩展包加载原理
    浅谈thinkphpcomposer扩展包加载原理本文将介绍ThinkPHP中Composer扩展包的加载原理,帮助读者更好地理解和应用该功能。前言如题,今天感觉好久没有更新博客了。最近迷上了物联网开发。一直在研究stm32、51这些东西。想起来前几天群里面有人问到tp扩展包原理。其实这个前......
  • WPF之浅谈数据模板(DataTemplate)
    数据模板有什么用简而言之,数据模板能让你更方便、更灵活的显示你的各类数据。只有你想不到,没有它做不到的(感觉有点夸张,实践之后,你就觉得一点不夸张......
  • 浅谈MultipartFile中transferTo方法的坑 服务器上面使用相对路径 file.transferTo(fil
    浅谈MultipartFile中transferTo方法的坑服务器上面使用相对路径file.transferTo(filePath.getAbsoluteFile())而不是file.transferTo(filePath.getPath())绝对路径,实际生产配置服务器里面的一个文件夹。比如配置服务器文件夹前缀为/downfile/excelfile原文链接:https://ww......
  • 武汉星起航浅谈亚马逊卖家如何编辑产品关键词,提升产品排名
    作为全球最大的在线零售平台之一,亚马逊为卖家提供了丰富的机会和潜力。在亚马逊平台上,一个关键的因素是如何编辑产品关键词,以帮助产品在搜索结果中脱颖而出,并提升排名。现在,武汉星起航将分享编辑产品关键词的秘诀,助力你的产品排名飙升。首先,关键词的选择至关重要。亚马逊卖家应该仔......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)条边构成的无向图,请你求出该图删除一个点之后,连通块最多有多少。解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节......