当前位置: 首页 > news >正文

G001 强连通分量 Tarjan算法 P2812 [USACO]Network of Schools 校园网络

P2812 校园网络 [USACO]Network of Schools - 洛谷

给定一个有向图, \(A \rarr B\) 表示 \(A\) 可以给 \(B\) 发送软件。

  • 问:最少需要给多少学校发送软件可以让所有学校收到
  • 问:最少加几条边,可以给任意一所学校发送软件使全图可以收到

在有向图中,如果节点之间形成了环(强连通分量) ,那么其中一个可以收到,环内所有节点都可以收到。

所以我们只需要对原图进行 缩点 成一个 DAG 。那么第一问就变成了:入度为 \(0\) 的节点有多个。第二问的意思变为再加几条边可以使图变为强连通图。

变成强连通图的条件是消除所有源点和汇点,假如度为 \(0\) 的点和入度为 \(0\) 的点的个数为 \(P,Q\) ,为了用最少得边将其串联起来,我们需要为其匹配的边为 \(\max(P,Q)\)

特判,如果缩点后 \(scc=1\) 那么该图已经是强连通图,此时 \(P=Q=1\) 但是,应该输出 \(0\) 不需要再加边了。

如果想要输出具体的边匹配情况,需要用到 二分图最大匹配 来寻找尽可能多的独立路径因为一般的循环配对法可能会生成小强连通环。进阶题目参考 QOJ #15056 JSOI 2014 强连通图 这道题目需要你严格的匹配源点和汇点。

具体 Python 代码如下

import sys
sys.setrecursionlimit(100000)
if 1:inp = lambda: sys.stdin.readline().strip()II = lambda: int(inp())MII = lambda: map(int, inp().split())LII = lambda: list(MII())Max = lambda x, y: x if x > y else yMin = lambda x, y: x if x < y else ydef main():n = II()g = [[]]for _ in range(n):v = LII()g.append(v[:-1])dfn = [-1] * (n + 1)low = [-1] * (n + 1)st = []inst = [False] * (n + 1)timer = 1scc = 0scc_id = [-1] * (n + 1)def tarjan(x):nonlocal timer, sccdfn[x] = low[x] = timertimer += 1st.append(x)inst[x] = Truefor y in g[x]:if dfn[y] == -1:tarjan(y)low[x] = Min(low[x], low[y])elif inst[y]:low[x] = Min(low[x], dfn[y])if dfn[x] == low[x]:while True:cur = st.pop()inst[cur] = Falsescc_id[cur] = sccif cur == x:breakscc += 1for i in range(1, n + 1):if dfn[i] == -1:tarjan(i)din = [0] * sccdout = [0] * sccfor u in range(1, n + 1):for v in g[u]:if scc_id[u] != scc_id[v]:din[scc_id[v]] += 1dout[scc_id[u]] += 1a = sum(1 for i in range(scc) if din[i] == 0)b = sum(1 for i in range(scc) if dout[i] == 0)print(a)print(Max(a, b) if scc != 1 else 0)if __name__ == "__main__":main()
http://www.jsqmd.com/news/405628/

相关文章:

  • Exadata的思科交换机,重启后进入到了rommon模式
  • 【实证分析】地市城乡融合发展数据集-含代码(2007-2023年)
  • 突破3D生成瓶颈:Dora-VAE如何通过重要性采样实现高保真重建
  • Python write 100M items data to csv file in batch
  • 2026山东债务协商服务优质机构推荐(负债人亲历实测,正规上岸指南) - 代码非世界
  • 2026冲刺用!AI论文平台 千笔·专业学术智能体 VS 锐智 AI,自考写作更高效!
  • 信用卡委托协商机构山东债务协商实战经验分享,真实案例解压指南 - 代码非世界
  • 2026年市面上有实力的汽车零件超声波清洗机源头厂家哪家靠谱,刻蚀机/液压阀体清洗机,汽车零件超声波清洗机生产厂家排名 - 品牌推荐师
  • 2026山东债务协商服务优质机构推荐:专业团队助您重掌财务主动权 - 代码非世界
  • 2026年2月最新发布:广州AI获客公司实力榜单,谁在领跑“自动化增长”? - 野榜精选
  • 2026最新!9个降AI率网站测评:专科生降AIGC必备工具全解析
  • 写作压力小了!10个降AIGC软件测评:自考降AI率必备工具推荐
  • 2026更新版!AI论文工具 千笔写作工具 VS speedai,本科生专属高效写作神器!
  • 科研党收藏!一键生成论文工具,千笔 VS 文途AI,专科生专属
  • 2026北京信用卡协商TOP5实测|负债党亲测避坑,专业度+口碑双在线,上岸少走弯路 - 代码非世界
  • 【学习笔记】珂朵莉树/颜色段均摊
  • 小红统计区间(easy)【牛客tracker 每日一题】
  • 2026北京信用卡协商TOP5机构实测:专业能力与口碑如何选? - 代码非世界
  • [AI提效-27]-2026年AI多媒体生成工具全景对比指南
  • [AI提效-26]-2026年多媒体创作工具全景指南
  • MATLAB代码:基于两阶段鲁棒优化算法的多微网联合调度及容量配置 关键词:多微网 优化调度 ...
  • 编译生成方法二:手动写cmake脚本
  • 编译生成方法一:build_oai --phy_simulators
  • 基于5G的车辆跟驰预警系统(论文+源码)
  • 基于物联网的超市智能自助购物系统设计(论文+源码)
  • 基于RFSOC+VU13P在复杂电磁环境构设中技术应用分析
  • 编译生成方法三:CMakePresets.json
  • 2026更新版!8个一键生成论文工具测评:自考毕业论文+开题报告高效写作指南
  • python高校体育馆场地预约系统 商品购买系统小程序
  • RFSOC与ADRV9009、AD9026、AD9361技术指标及应用场景对比分析