缩点 & 割点 & 割边

Tarjan 算法

强连通分量

若图 $G$ 中存在一个子图 $G'$$G'$ 中任意两点均可互相到达则称 $G'$$G$ 的一个强连通分量$G'$ 不存在一个严格子图为强连通分量$G'$$G$极大强连通分量

图的强连通分量可以考虑使用 $\rm Tarjan$ 算法求解

$\rm Tarjan$ 算法的思想是这样的如果一个点的 $\rm dfs$ 序等于他能访问到的最小的 $\rm dfs$那么在 $\rm dfs$ 树中它的下方会出现一个强连通分量且所有最小能访问到的 $\rm dfs$ 序等于它的点属于这个强连通分量

时间复杂度 $\Theta(n+m)$

参考代码

void Tarjan (int u) {
    dfn[u] = low[u] = ++tix, Sta[++top] = u;
    for (int i = last[u]; i; i = Next[i])
        if (!dfn[to[i]]) Tarjan(to[i]), low[u] = min(low[u], low[to[i]]);
        else if (!SCC[to[i]]) low[u] = min(low[u], dfn[to[i]]);
    if (dfn[u] == low[u]) {
        SCC[u] = ++id;
        while (Sta[top] != u) SCC[Sta[top--]] = id;
        top--;
    }
}

点/边双连通分量

如果在 $\rm dfs$ 树上某个结点 $u$ 存在一个子节点 $v$ 满足 $low_v\geqslant dfn_u$ 则说明 $v$ 想到达 $u$ 的祖先结点必须经过 $u$所以 $u$ 是一个割点

当然根节点不能通过这种方式来判断应该看它的子节点数是否大于等于 $2$如果是则它为割点

遍历的时候要记得判掉父子边

和判断割点的方法几乎一模一样唯一的区别是判断 $dfn_u<low_v$ 而不是 $dfn_u\leqslant low_v$如果从 $v$ 出发连 $u$ 都无法到达那么 $(u, v)$ 就是一条割边

判断割边的时候根节点不需要特殊考虑

时间复杂度 $\Theta(n+m)$

参考代码

void Tarjan (int u, int rt) {
    dfn[u] = low[u] = ++tix;
    int son = 0;
    for (int i = last[u]; i; i = Next[i]) {
        if (!dfn[to[i]]) {
            son++, Tarjan(to[i], rt);
            low[u] = min(low[u], low[to[i]]);
            if (low[to[i]] >= dfn[u] && u != rt) cut[u] = true;
        }
        low[u] = min(low[u], dfn[to[i]]);
    }
    if (u == rt && son > 1) cut[u] = true;
}

经典例题

[国家集训队] 稳定婚姻

首先在夫妻之间连有向边 $B_i\to G_i$然后在情人之间连有向边 $G_i\to B_i$

可以发现$G_i$$B_i$ 的婚姻情况发生了改变那么一定存在一个从 $G_i$ 开始 $B_i$ 结束的环

于是我们使用 $\rm Tarjan$ 算法求强连通分量$B_i$$G_i$ 属于同一个强连通分量那他们一定属于一个环则他们是不安全的否则就是安全的

时间复杂度 $\Theta(n+m)$

[ZJOI2007] 最大半连通子图

首先缩点发现强连通分量内的点一定属于同一个极大半连通子图

然后将 $\rm DAG$ 画出来发现最大半连通子图一定是某条从无入度结点到无出度结点的链长度和方案数直接 $\rm DAG$$\rm DP$ 即可

需要注意的是在这题中由于求的是导出子图所以不能有重边

时间复杂度 $\Theta(n+m)$

[HNOI2012] 矿场搭建

先把个点和点双连通分量处理出来对每个点双分开处理

  • 若该点双无割点则需要建两个出口
  • 若该点双有一个割点则需要在这个点双内建一个出口且不能建在割点上
  • 若该点有两个以上割点则不需要建出口因为一定可以从某个割点跑出去

方案数直接乘法原理计算即可

时间复杂度 $\Theta(n+m)$

[HAOI2010] 软件安装

可以发现这是一棵基环外向树依题意环中结点必须选剩下的构成一棵树直接树上背包即可

时间复杂度 $\Theta(nm)$