1. 题目背景与问题定义
这道来自蓝桥杯2013年第四届真题的"危险系数"问题,考察的是图论中关于网络关键节点的应用。题目背景设定在抗日战争时期的地道战场景,将实际军事问题抽象为图论模型。
给定一个由n个站点(顶点)和m条通道(边)组成的地道网络,我们需要计算两个特定站点u和v之间的危险系数DF(u,v)。危险系数的定义是:对于站点u和v,如果存在某个站点z,当z被破坏后u和v不再连通,那么z就是u和v的一个关键点。DF(u,v)的值就是u和v之间所有关键点的数量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与算法选择
2.1 图论模型建立
首先我们需要将地道网络建模为无向图:
- 站点 → 图的顶点
- 通道 → 图的边
- 网络连通性 → 图的连通性
2.2 关键点识别方法
识别关键点的核心思路是:对于每个可能的站点z(除了u和v本身),我们暂时移除它(及其所有边),然后检查u和v是否仍然连通。如果不连通,则z是一个关键点。
2.3 算法选择与优化
最直接的暴力解法是对每个顶点进行删除测试,但这样时间复杂度为O(n*(n+m)),对于n=1000的数据规模可能不够高效。更优的解法是利用以下观察:
关键点实际上就是u到v的所有路径都必须经过的点。因此我们可以:
- 找到u到v的所有简单路径
- 统计出现在所有路径上的顶点数量(不包括u和v本身)
这种方法可以使用DFS或BFS配合访问计数来实现。
3. 详细实现步骤
3.1 输入处理与图表示
python复制n, m = map(int, input().split())
graph = [[] for _ in range(n+1)] # 邻接表表示,顶点编号1~n
for _ in range(m):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
start, end = map(int, input().split())
3.2 连通性检查(BFS实现)
python复制from collections import deque
def is_connected(graph, start, end, e
