用Python+NetworkX复刻PTA天梯赛‘红色警报’题:从图论到实战的保姆级教程
当城市间的道路成为战火中的生命线,如何用代码守护国家的连通性?这个来自PTA天梯赛的经典题目,将带我们走进图论的实战世界。不同于枯燥的算法理论,我们将用Python的NetworkX库构建可视化战场,通过深度优先搜索(DFS)算法动态监测城市沦陷对国家连通性的影响。本文不仅会还原题目解法,更会带你体验从竞赛代码到工程实践的思维跃迁。
1. 理解问题本质:战争中的图论模型
题目描述了一个典型的连通性监控场景:给定N个城市和M条道路构成的无向图,当某个城市被攻占时,需要判断是否会破坏整个国家的连通性。这本质上是在考察图的连通分量概念——即图中互相连通的子图数量。
关键判定条件:
- 初始连通分量数为
k - 删除城市后连通分量数
>k:发出红色警报 - 删除城市后连通分量数
≤k:普通警报
注意:即使原本国家就不完全连通(k>1),只要删除城市没有增加连通分量数,就不触发红色警报
用邻接表表示的城市网络示例:
python复制cities = {
0: [1, 3, 4],
1: [0, 3],
2: [],
3: [0, 1],
4: [0]
}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与数据准备
2.1 安装必要库
bash复制pip install networkx matplotlib
2.2 输入数据解析
PTA的输入格式需要特殊处理:
python复制def parse_input():
import sys
data = sys.stdin.read().split()
ptr = 0
N, M = int(data[ptr]), int(data[ptr+1])
ptr +=2
edges = []
for _ in range(M):
u, v = int(data[ptr]), int(data[ptr+1])
edges.append((u, v))
ptr +=2
K = int(data[ptr])
