学校信息中心有 12 台服务器,之间用网线互相连接。网络管理员小周遇到了三件事。
第一件事:单向链路。他们把部分链路换成了「单向光纤」(A 能发给 B,B 不能回发给 A)。有天半夜,运维同学发现从管理终端 A 能访问到服务器 B,但从 B 死活连不上 A。小周意识到:无向图里「连通」是相互的,有向图里却出现了「单向可达」——这就要区分可达与强连通。
第二件事:单点故障。某台核心交换机重启了,结果整个机房分成了两半,谁也连不上谁。小周画图后发现:这台机器是整张图的割点,一拔掉,图就断开。
第三件事:单线故障。更巧的是,某根主干网线被施工挖断了,同样导致网络分裂。这根线就是桥——它不是点的问题,而是边的问题。
小周翻开教材,看到一句话:「无向图论连通性,有向图论强连通,再按『删点还是删边会断』分出点双与边双。」 他恍然大悟:原来这些名词是在回答三个完全不同的问题。
连通性 = 在问「图有多结实」;割点/桥 = 在找「哪里最脆弱」。
💡 故事背后的算法思想
「互相可达」是等价关系:若 u 能到 v、v 能到 u,且 v 能到 w、w 能到 v,那么 u 也必然能到 w(u→v→w)且 w 能到 u(w→v→u)。所以「强连通」把有向图的点划分成若干个强连通分量 (SCC),每个分量内部完全互通。
缩点把环抱成团:把每个 SCC 压缩成一个点,得到的图一定不含环 —— 也就是 DAG。这样上一讲学的拓扑排序 + DAG DP 就能派上用场。这就是「SCC + 缩点」为什么是竞赛里的万能起手式。
双连通刻画「抗打击能力」:点双连通要求删掉任意一个点仍连通(无割点),边双连通要求删掉任意一条边仍连通(无桥)。把它们拆成块之后,图的「韧性」就变成一棵树,可以拿来做树上 DP。