You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

可感染全有向图的最小初始顶点集算法及近似方案问询

有向图最小初始感染顶点集求解方案

规则对齐

先明确问题边界,避免理解偏差:

  • 传播规则:有向图中任意顶点A,当所有满足有向边A→B的邻接顶点B全部被感染时,A会自动被感染,传播过程按上述规则迭代直至没有新顶点被感染
  • 强制约束:所有带自环的顶点必须纳入初始感染集——这类顶点存在出边指向自身,永远无法靠其他顶点的传播触发感染,只能作为初始种子
  • 优化目标:找到规模最小的初始顶点集合,使得按上述规则传播后可覆盖全图

传播过程示例:
初始感染集取{E,A}时:

  1. 第一轮:F、D的所有出边仅指向E,E已感染,因此F、D被触发感染
  2. 第二轮:B的出边分别指向A、D,二者均已感染,因此B被触发感染
  3. 第三轮: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:36:23