zoukankan      html  css  js  c++  java
  • 次小生成树 | 割点 | 割边

    总结下割点,割边,次小生成树问题

    这些日子复习算法,学习了次小生成树和割点割边,在这简单记录下算法思路。

    次小生成树:
    对一颗树定义一个这样的变换f(T),意思是选一条在最小生成树T'上的一条边,并且该边不在T中。将它加入T,然后去掉环中不在T'上的一条边,这样可以保证w(f(T)) <= w(T),经过一系列变换后,就可以从T变到T'了。
    然后求次小生成树,也就是变换的倒数第二颗树了,具体做法是,枚举一条不在T'上的边加入T'中,然后删掉一条环中权重最大的边,取最小值即可。由于要维护任意两个点u, v之间最大的边,所以复杂度是O(V^2)。

    割点:
    无向图割点的求法,无向图的深度优先搜索树中只有tree和back边,没有cross和forward边。求割点的算法在dfs中完成,从根搜索到某个节点u时,根和u可以形成一个连通分量,考虑节点u的儿子,观察每一个儿子形成的连通分量是否和根形成的连通分量融合在一起(不通过<u-son>那条路),如果不融合在一起,则知道u是个割点;如果寻遍所有儿子,都和根融在一起,那u就不是割点了。具体做法是,对每个节点u,记录low(u)表示该节点在深度优先搜索树中,通过back边以及儿子通过back边,所能reach的最小的时间戳。每次对于u-son,如果low(son) >= time(u)的话,则u是割点,若所有u-son对,都不满足low(son) >= time(u)的话,则u不是割点。
    需要注意的是,当u是根时,需要判断,儿子的个数是否大于1(因为根砍掉后,根那部分就没有连通分量了,需要看儿子形成的连通分量,因为要判断砍掉一个点后,连通分量的个数是否增多)

    割边:
    类似判断割点的方法,需要注意的是,当判断<u, son>时,若low(son) > time(u)的话,则<u, son>是个桥,由于是枚举边,所以没有像割点的那种特殊问题,但判断(root, son)时,还按low(son) > time(u)来判断。当有重边时,对边进行标记就可以了,其中一条边是tree边,其它边是back边。

    次小生成树的实现细节要少,没有实现,割点割边的算法,我验证了下算法的正确性。

  • 相关阅读:
    Maven搭建Spring+Struts2+Hibernate项目详解
    Missing artifact com.sun:tools:jar:1.5.0
    post和get的区别?
    $(document).ready(function(){}),$().ready(function(){})和$(function(){})三个有区别么
    Spring配置dataSource的三种方式 数据库连接池
    关于sqlSessionTemplate
    sql中between and 用法
    用Java自定义一个定时器
    Tomcat unable to start within 45 seconds.
    如果 date_field = TRUNC(date_field) 就说明时分秒为0(也就是不包含),否则就包含时分秒
  • 原文地址:https://www.cnblogs.com/litstrong/p/2306323.html
Copyright © 2011-2022 走看看