zoukankan      html  css  js  c++  java
  • Tarjan

    有向图的强连通分量:两个点如果能够相互到达,那么称他们相互强连通。若一个有向图的所有点对都是相互强连通的,那么称之为强连通图。一个有向图的极大强连通子图称为该图的强连通分量。
    无向图的割点/边:去掉该点/边之后无向图的连通性发生改变的点/边称为割点/边。
    无向图的点/边双连通分量:若一个无向图不存在割点/边,则称作点/边双连通图。一个无向图的极大点/边双连通子图称为该图的点/双连通分量。
    强连通分量记为scc,点双连通分量记为v-dcc,边双连通分量记为e-dcc,双连通分量统一记为dcc。

    缩点

    遍历到时把点加入栈。
    然后如果回溯到某个点时(low_u=dfn_u),那么我们栈上面的一部分(弹完(u)为止)就是一个scc。
    注意Tarjan求出来的scc编号恰好是拓扑序反序。
    我们可以把每个scc缩成一个点,那么我们可以得到一个DAG。
    然后我们就可以在这个DAG上面根据拓扑序DP了。

    割点

    如果一个点(u)存在一个出点(v),满足(low_vge dfn_u),那么(u)就是该图的一个割点。
    如果是dfs的根节点,那么需要存在两个出点满足上述条件才是一个割点。
    两个v-dcc之间由割点连接,并且有且仅有一个割点。
    所以一个割点可能属于多个v-dcc。
    v-dcc的维护需要圆方树,这里就不做研究了。

    割边(桥)

    如果一条边((u,v))满足(low_v>dfn_u)(dfs过程中(v)不能走到(u)),那么((u,v))就是该图的一条割边。
    把割边都去掉之后剩下的就是e-dcc,每个e-dcc都是一个连通块。
    我们可以把一个e-dcc缩成一个点,而割边看做一条边,那么我们可以得到一颗树。
    得到树能做什么就不用我说了吧。

    LCA?

    这东西有用?.jpeg

  • 相关阅读:
    GUIX 创建工程注意事项
    VS 中bool和BOOL的区别
    git 在Windows上的应用
    rt-thread 相关网站地址
    tcp client
    VS2015 下载地址
    软件各种协议比较(GPL、AGPL、LGPL、Apache、Zlib/Libpng、BSD、MIT)
    UILabel标签
    UIbutton
    数据互转
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11930073.html
Copyright © 2011-2022 走看看