- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
对Tarjan算法的总结xy4hs wjyyy〇、tarjan算法的大纲 HYPERLINK http://www.wjyyy.top/category/%E5%9B%BE%E8%AE%BA/tarjan tarjan专题 这是我在博客里整理的有关tarjan的内容。最主要的分为两个板块,有向图和无向图一、有向图1.缩点、强连通分量? HYPERLINK http://www.wjyyy.top/336.html 代码和注释如果在一个有向图中,任意两个节点可以互相到达,那么这些点和它们之间的边构成的图叫强连通分量,如果这些边没有边权,等价于一个点,如 HYPERLINK /problemnew/show/P2812 洛谷P2812 校园网络。如果这些点有点权,那么它们所缩成的点最大点权等于强连通分量中点权之和,见 HYPERLINK /problemnew/show/P3387 洛谷P3387 缩点。?对于求强连通分量,我们由tarjan算法来实现。首先对每个没有遍历过的点为起点,进行dfs,每找到一个新点入栈一次,如果遍历到了已经遍历过的点,说明这个被二次遍历的点可以通过一个有向环回溯到自己。如果回溯所找到的时间戳小于自己所能回溯找到的最小时间戳(默认为自己的时间戳),那么将自己的回溯时间戳更新到更小。?当dfs的递归回溯到自己时,将自己的回溯时间戳更新到子节点和自己中最小的一个,如果无法更新到比自己更小,说明自己是一个强连通分量的根结点,把栈中所有自己以上的点全部出栈,认为在同一个强连通分量中,根据题目需要进行处理。如果可以更新到更小,就把自己留在栈里,继续递归。?2.环在有向图中,我们一般找的是最小环,用一遍dfs就可以完成。不需要栈,只需要一个dfn数组。利用记忆化搜索的技巧,如果遍历到一个被搜过的点,它一定不能更新最小环为更小值,因为它的子树已经被遍历完了。在遍历过程中,用bfs序给各节点打上时间戳,就可以求出最小环的长度了。?二、无向图1.树的最近公共祖先(lca)和树上点的距离 HYPERLINK http://www.wjyyy.top/334.html 最近公共祖先详解? ? HYPERLINK http://www.wjyyy.top/343.html 树上距离例题最近公共祖先(和树上距离)是可以通过倍增在O(NlogN)时间内跳出来的,不过是离线算法。tarjan相比较更优,不仅是在线算法,而且一遍dfs复杂度只需要O(N)。用到的技巧有并查集、前缀和等。在dfs过程中,对于一个子树的根结点,它的所有孩子与它自己的最近公共祖先都是它自己,所以先不把当前祖先更新到子树的根结点的父亲。等?树上前缀和就是在dfs过程中存储各个节点到根结点的距离,如果在同一条链上就可以直接相减。而lca是一定与两个询问点分别和根结点“三点共链”的,因此可以快速求出两点之间的距离。?2.双连通分量? ?①点双连通分量、割点: HYPERLINK http://www.wjyyy.top/349.html 代码解析在无向图中,对于一个分图,去掉其中任意一个点(及其有关边),其他各点仍然可以两两互达的分图叫做点双连通分量(包括一个点或两个相邻的点),往往处理一些割点问题。割点就是去掉后可以把一个连通图分为两个互不干扰的连通图。一张连通图上的所有割点,可以分这张图为多个双连通分量。?割点的求法:特殊情况:对于一个有多孩子的根结点,它是一个割点。那么去掉这个点可分这棵树为一个森林,而如果只有一个孩子就不是森林了。 ? 其他情况:如果一个点的孩子遍历完后,能回溯到的点不浅于这个点的时间戳(不能是回溯值,因为这个点可能属于另一端的双联通分量,可回溯过去),也就是low[son]=dfn[x],说明这个点是一个割点,我们可以理解为这个点将它下面的点封锁了。?注意事项:在遍历过程中,双向边是可以访问到父亲的,但是要跳过,不然会乱了顺序。?? ?②边双连通分量、割边/桥在无向图中,对于一个分图,去掉其中任意一条边,其他各点仍可以两两互达的分图叫边双连通分量。割边其实和割点是异曲同工的。因为删去割点,它附近的边也随之失效,就促成了割边。去掉割边,两侧互不干扰,但不一定为边双连通分量,而是连通图。?割边的求法:没有特殊情况,所有情况和割点一般情况相同,在判断时需要稍作改动。因为割边两侧的点分属两个不同的区块,所以割边的一端(设为u)不能被另一端(设为v)的孩子遍历到,也就是回溯值不能小于v。因为我们是在递归过程中判断的,所以对于u,如果它的一棵子树的根结点的回溯值大于自己的时间戳(同样不能是回溯值),即low[v]dfn[u]。那么这条连接u,v的边就是一条割边了。?因为割点影响了边,而割边没有影响点,所以割边的两端一定都是割点,而割点所连的边不一定是
文档评论(0)