可感染全有向图的最小初始顶点集算法及近似方案问询
有向图最小初始感染顶点集求解方案
规则对齐
先明确问题边界,避免理解偏差:
- 传播规则:有向图中任意顶点
A,当所有满足有向边A→B的邻接顶点B全部被感染时,A会自动被感染,传播过程按上述规则迭代直至没有新顶点被感染 - 强制约束:所有带自环的顶点必须纳入初始感染集——这类顶点存在出边指向自身,永远无法靠其他顶点的传播触发感染,只能作为初始种子
- 优化目标:找到规模最小的初始顶点集合,使得按上述规则传播后可覆盖全图
传播过程示例:
初始感染集取{E,A}时:
- 第一轮:F、D的所有出边仅指向E,E已感染,因此F、D被触发感染
- 第二轮:B的出边分别指向A、D,二者均已感染,因此B被触发感染
- 第三轮:C的所有出边仅指向B,B已感染,因此C被触发感染
最终实现全图覆盖。
无效初始集反例:
- 初始集仅为{B}时,不存在能触发A感染的传播路径,A始终未被感染,无法覆盖全图
- 初始集仅为{A}时,B的出邻接顶点D未被感染,B无法触发感染,无法覆盖全图
适配大规模稀疏图的近似算法
该问题属于NP难问题,针对提到的75万节点、平均单节点连边数约10的稀疏图场景,不需要追求理论最优近似比,直接使用下述线性时间贪心算法即可,单次运行即可得到可用结果,普通硬件上耗时仅数秒到十几秒,实际场景下得到的初始集规模和理论最优值的差距通常在15%以内:
- 预处理阶段
- 遍历所有顶点,将所有带自环的顶点直接加入初始感染集,标记为已感染,从待处理顶点集合中剔除
- 去重所有重边:重复的
A→B边对传播规则无影响,仅保留1条即可减少后续计算量 - 为每个剩余顶点维护一个
待感染出邻接计数,初始值等于该顶点的出度(即该顶点还有多少个出边指向的顶点未被感染) - 初始化传播队列,将所有出度为0的汇点顶点加入队列——这类顶点没有需要等待感染的出邻接点,若不加入初始集则永远无法被触发感染
- 传播模拟与初始集补全阶段
- 逐次从队列中取出顶点
u:若u未被标记为感染,直接将其加入初始感染集,标记为已感染 - 遍历所有存在边
v→u的前驱顶点v,将v的待感染出邻接计数减1;若计数归0,说明v的所有出邻接顶点已全部被感染,v会被自动触发感染,标记v为已感染后加入队列,继续迭代传播
- 逐次从队列中取出顶点
- 剩余强连通分量处理阶段
- 上述流程跑完后,剩余未被标记感染的顶点全部位于出度大于0的强连通分量(SCC)内部,分量内不存在可被自动触发感染的顶点
- 对每个独立的剩余强连通分量,直接选1个顶点加入初始感染集即可:优先选分量内出度最小的顶点,能进一步压缩初始集规模;选点完成后重新执行上述传播模拟流程,直到所有顶点被标记为感染即可
可选优化
如果对初始集规模有更高要求,可以在处理强连通分量阶段,对每个大小超过10的分量跑一次小规模的贪心选点:每次选当前分量内能触发最多新顶点感染的点加入初始集,直到分量内所有顶点可被传播覆盖,通常能再把初始集规模压缩5%-10%,带来的额外计算开销对75万节点规模的图完全可接受。
内容的提问来源于stack exchange,提问作者Nathan Kim
相关产品推荐
相关产品推荐

