小林是学校信息社的社长,今年轮到他们社团承办校园科技节。开幕前一周,他桌上堆了三张图纸,每一张都让他头疼。
第一张图是「岗位分配表」:学校有 6 名志愿者,8 个展区岗位,每个志愿者只会应聘其中几类岗位。小林想安排「每个人恰好负责一个岗位、每个岗位恰好由一个人负责」,问最多能排满多少个岗位?指导老师看了一眼说:「你这就是在二分图里求最大匹配。」
第二张图是「巡展通道图」:科技节有若干展馆,展馆之间由走廊相连。小林希望设计一条巡视路线,让每一条走廊恰好走一次,最后回到出发点,这样每段路都能检查到又不会重复走冤枉路。老师又笑了:「典型的欧拉回路问题,看度数为奇数的是不是 0 个。」
第三张图是「筹备任务图」:搭建展台、印制海报、联系嘉宾、调试设备……任务之间有严格的先后依赖(海报没印好就没法布展)。小林想知道「最少要分几个阶段,才能把所有任务排完」。老师说:「把依赖画成有向图,若没有环,就能拓扑排序。」
三张图,三个问题,答案竟然都取决于图「长什么样」。小林这才明白:图论不是背模板,而是先给图做「体检」,再决定用什么药。
看图 → 分类 → 套条件 → 选算法,这才是提高组图论的正确打开方式。
💡 故事背后的算法思想
稀疏还是稠密决定「怎么存」:志愿者和岗位之间的边很少,属于稀疏图;如果用 n×n 的邻接矩阵存,绝大部分格子都是 0,白白浪费空间。反过来,若图本来就有 O(n²) 条边(如完全图),矩阵反而更快。
二分图决定「能不能匹配」:第一张图里「志愿者」和「岗位」是两个互不相交的集合,边只在集合之间,这正是二分图的定义。二分图有大量漂亮性质(最大匹配 = 最小点覆盖 = 最大独立集补集),这是普通图没有的。
欧拉图决定「能不能一笔画」:一笔画的存在性与「每个点的度数奇偶性」严格挂钩。奇度点个数只有 0、2 两种可能值,这是图论中少见的「充要条件如此干净」的定理。
DAG 决定「能不能按顺序推」:无环的有向图存在拓扑序,所有「拓扑序上从前往后推」的 DP 都能一趟搞定,复杂度 O(n+m)。一旦有环,这套逻辑立刻崩掉。