【图论】Tarjan 入门

配套 Tarjan 讲解文章:【图论】Tarjan 入门。

本题单收录做法为 Tarjan 的较简单题目(不排除部分题目还有其他做法)。如果想要入门 Tarjan,本题单适合。

题目难度大致为绿-蓝提高组选手适合(Tarjan 算法在提高组大纲中)。

部分题目可能需要以下基础:

注意到 Tarjan 算法的码量有时多于 100 行,所以学习本算法还要求您有较强的代码实现能力。

Tarjan 介绍:

Tarjan 算法是一种可以在 \operatorname{O}(n+m) 的时间复杂度内求解一张有向图的强连通分量的算法。

强连通分量:在一张有向图 G 中,如果两个点 uv 满足 u 可到达 vv 可到达 u,则称 uv 强连通;一个强连通分量要求在该分量里的任意两个点强连通。

求出了强连通分量,就可以缩点了,把同一个强连通分量里的点缩成一个。缩完的图显然是个 DAG(如果还有环就还有强连通分量)。于是就可以在 DAG 上 dp,拓扑排序等了。同时 Tarjan 的遍历顺序还是逆拓扑序,因此可以把 dp 和 Tarjan 写在一起。不过两个算法的时间复杂度都是线性的,这么写用处不大。

Tarjan 算法也可以求解一张无向图的割点和割边。

割点:如果在一张无向图 G 中去掉了点 u 导致图不连通,点 u 称为该图的割点。割边的定义类似,如果在一张无向图 G 中去掉了边 w 导致图不连通,边 w 称为该图的割边。

显然割点和割边不是唯一的。Tarjan 算法也可以在 \operatorname{O}(n+m) 的时间复杂度内求解一张无向图的所有割点和割边。

同时该算法也可以求解双连通分量问题,具体见 P8436 和 P8435。

题目的提示:

强连通分量:B3609、P2863、P1726、P1407。

B3609:模板。

P2863:模板。

P1726:模板。

P1407:虽然是无向边,但是可以把夫妻化有向边为男->女,情侣为女->男,正确性很微妙。此外还有二分图做法。

缩点:P3387、P10944、P2746、P2341、SP14887、P3627、P1073、P2272、P2515。

P3387:模板。

P10944:缩完点是链就符合条件。

P2746:缩完点考虑怎样加边让所有学校都有。

P2341:缩完点后,考虑什么样的点是受欢迎的。

SP14887:缩完点跑 dijstkra 或者拓扑排序。

P3627:缩完点后在 DAG 上 dp。

P1073:缩完点跑拓扑排序,拓扑排序的过程中 dp。

update 2024.10.24:P1073 的新 hack 数据参考代码也可通过。

P2272:缩完点后在 DAG 上 dp,注意删掉重边防止重复计算方案。

P2515:tarjan 和树上背包的结合体,需要先缩点然后再跑一遍树上背包。但是因为数据太小,还保证是基环树,所以可以有其他做法。

割点:P3388、UVA315、P3469、P3225。

P3388:模板。

UVA315:模板,难点在于读入。

P3469:考虑对于不是割点和是割点分开计算。

P3225:求完割点之后,考虑每个割连通块(即 dfs 到割点就停止 dfs 的连通块)中的割点个数。

边双连通分量:P8436、P2860、P2783、P7924。

P8436:模板。

P2860:先考虑树的情况。

P2783:缩边双(每个点只会出现在一个边双上)然后建新图跑 lca。

P7924:不难注意到一条路径上若经过 x,则 x 所在边双所有点都会被算入答案,所以缩边双,然后跑 lca,树上差分就行了。

点双连通分量:P8435、B3610。

P8435:模板。

B3610:块的定义就是点双,但是不包括单个点。

口胡题解及参考代码。马蜂比较丑,见谅。


  1. B3609 - [图论与代数结构 701] 强连通分量
  2. P2863 - [USACO06JAN] The Cow Prom S
  3. P1726 - 上白泽慧音
  4. P1407 - [国家集训队] 稳定婚姻
  5. P3387 - 【模板】缩点
  6. P10944 - Going from u to v or from v to u?
  7. P2746 - [IOI 1996 / USACO5.3] 校园网 Network of Schools
  8. P2341 - [USACO03FALL / HAOI2006] 受欢迎的牛 G
  9. SP14887 - GOODA - Good Travels
  10. P3627 - [APIO2009] 抢掠计划
  11. P1073 - [NOIP 2009 提高组] 最优贸易
  12. P2272 - [ZJOI2007] 最大半连通子图
  13. P2515 - [HAOI2010] 软件安装
  14. P3388 - 【模板】割点(割顶)
  15. UVA315 - Network
  16. P3469 - [POI 2008] BLO-Blockade
  17. P3225 - [HNOI2012] 矿场搭建
  18. P8436 - 【模板】边双连通分量
  19. P2860 - [USACO06JAN] Redundant Paths G
  20. P2783 - 有机化学之神偶尔会做作弊
  21. P7924 - 「EVOI-RD2」旅行家
  22. P8435 - 【模板】点双连通分量
  23. B3610 - [图论与代数结构 801] 无向图的块