<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tarjan &#8211; HU Xiaoxu</title>
	<atom:link href="https://blog.ihuxu.com/tag/tarjan/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ihuxu.com</link>
	<description>a software engineer&#039;s blog</description>
	<lastBuildDate>Mon, 15 Apr 2024 05:15:20 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>
	<item>
		<title>60 分钟搞定 Tarjan 算法求解无向图的割点与桥</title>
		<link>https://blog.ihuxu.com/tarjan-algorithm-and-cut-points-and-bridges-for-undirected-graphs/</link>
					<comments>https://blog.ihuxu.com/tarjan-algorithm-and-cut-points-and-bridges-for-undirected-graphs/#respond</comments>
		
		<dc:creator><![CDATA[HU Xiaoxu]]></dc:creator>
		<pubDate>Mon, 09 Dec 2019 16:09:16 +0000</pubDate>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Data Structure and Algorithm]]></category>
		<category><![CDATA[Graph]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Tarjan]]></category>
		<guid isPermaLink="false">https://blog.ihuxu.com/?p=12052</guid>

					<description><![CDATA[本人在学习 Tarjan 算法求解无向图的割点与桥的问题时，很快发现了一篇简洁易懂的文章。很顺利地了解算法的思路，并写出了“高效”的代码，此时内心飘过 —— So Easy。然而，当我翻开《算法竞赛进阶指南》这本书的有关篇章时，我发现其中经过精简优化的代码有几条语句让我不得其所。以至于，花了较多心思和时间来思考🤔这段真正高效的 Tarjan 算法的工作原理以及代码的编写。 关于 Tarjan 算法，我将会写若干篇系列文章，来完整系统地介绍 Tarjan 算法的原理以及其主要解决的问题。而在本章我主要讲一个问题 —— 如何使用 Tarjan 算法求解无向图的割点与桥。 在讲述问题之前，我们先来简单地了解下什么是 Tarjan 算法？ Tarjan 算法 Tarjan 算法是基于深度优先搜索的算法，用于求解图的连通性问题。Tarjan 算法可以在线性时间内求出无向图的割点与桥，进一步地可以求解无向图的双连通分量；同时，也可以求解有向图的强连通分量、必经点与必经边。 如果，你对上面的一些术语不是很了解，那么也毫无关系。目前为止，我们只要知道 Tarjan 算法是基于深度优先搜索的，用于求解图的连通性问题的算法就好了。 提到 Tarjan，不得不提的就是算法的作者 —— Robert Tarjan。他可是一名著名的计算机科学家，我们耳熟能详的最近公共祖先（LCA）问题、强连通分量问题、双连通分量问题的高效算法都是由他发现并解决的，同时他还参与了开发斐波那契堆、伸展树的工作。 无向图的割点与桥 首先，什么是无向图？简单说，若一个图中每条边都是无方向的，则称为无向图。 割点 若从图中删除节点 以及所有与 关联的边之后，图将被分成两个或两个以上的不相连的子图，那么称 为图的割点。 桥 若从图中删除边 之后，图将分裂成两个不相连的子图，那么称 为图的桥或割边。 如何求解图的割点与桥？ 那么，在了解了 Tarjan 算法的背景以及图的割点与桥的基本概念之后，我们下面所面临的问题就是 —— 如何求解图的割点与桥？ 在这里，我们开门见山，直接引出 Tarjan 算法在求解无向图的割点与桥的工作原理。 时间戳 时间戳是用来标记图中每个节点在进行深度优先搜索时被访问的时间顺序，当然，你可以理解成一个序号（这个序号由小到大），用 来表示。 搜索树 在无向图中，我们以某一个节点 出发进行深度优先搜索，每一个节点只访问一次，所有被访问过的节点与边构成一棵树，我们可以称之为“无向连通图的搜索树”。 追溯值 追溯值用来表示从当前节点 作为搜索树的根节点出发，能够访问到的所有节点中，时间戳最小的值 —— 。那么，我们要限定下什么是“能够访问到的所有节点”？，其需要满足下面的条件之一即可： 是的，你可能觉得这段话太绕了，那么我们通过动画的方式来摸你追溯值真实计算过程。 在上面的计算过程中，我们可以认为以序号 为根的搜索树的节点有 。上面所说的“通过一条非搜索树上的边”可以理解成动画中的 这条边，“能够到达搜索树的所有节点”即为节点 。<div class="read-more"><a class="btn read-more-btn" href="https://blog.ihuxu.com/tarjan-algorithm-and-cut-points-and-bridges-for-undirected-graphs/">Read More</a></div>]]></description>
		
					<wfw:commentRss>https://blog.ihuxu.com/tarjan-algorithm-and-cut-points-and-bridges-for-undirected-graphs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://blog.ihuxu.com/wp-content/uploads/2024/04/v3_6cd03b2c-3292-11ea-8fc1-165bd6f00369_1.mp4" length="104155" type="video/mp4" />
<enclosure url="https://blog.ihuxu.com/wp-content/uploads/2024/04/v3_1d8dc54c-3293-11ea-adeb-8e79ebed40e0_1.mp4" length="26240" type="video/mp4" />

			</item>
	</channel>
</rss>
