抗日战争时期,冀中平原的地道战曾发挥重要作用。
地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
我们来定义一个危险系数DF(x,y):
对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。本题的任务是:已知网络结构,求两站点之间的危险系数。【输入形式】
输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,通道数;
接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条通道;
最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。【输出形式】
一个整数,如果询问的两点不连通则输出-1.
【样例输入】7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6【样例输出】2
from collections import defaultdict, deque #引入双端队列、特殊字典dafaultdictdef find_all_paths(graph, start, end, path=[]):# 将起始站点添加到当前路径中path = path + [start]# 如果起始站点和终止站点相同,返回当前路径if start == end:return [path]# 如果起始站点不在图中,返回空列表if start not in graph:return []# 初始化一个空列表用于存储所有路径paths = []# 遍历起始站点的所有邻居节点for node in graph[start]:# 如果邻居节点不在当前路径中if node not in path:# 递归调用 find_all_paths 函数,查找从邻居节点到终止节点的所有路径new_paths = find_all_paths(graph, node, end, path)# 将新路径添加到所有路径列表中for p in new_paths:paths.append(p)return paths# 检查两点是否连通
def is_connected(graph, start, end, removed=None):#记录节点的访问情况visited = set()#记录去除的节点if removed is not None:visited.add(removed)queue = deque([start])visited.add(start)while queue:node = queue.popleft()if node == end:return Truefor neighbor in graph[node]:if neighbor not in visited:queue.append(neighbor)visited.add(neighbor)return False# 计算危险系数
def calculate_danger_coefficient(graph, start, end):if not is_connected(graph, start, end):return -1danger_count = 0for node in graph.keys():if node not in [start, end]:# 去除节点node,观察start,end是否连接来确定node是否是中间节点if not is_connected(graph, start, end, node): danger_count += 1return danger_count# 读取输入
n, m = map(int, input().split())
graph = defaultdict(list)
for _ in range(m):u, v = map(int, input().split())graph[u].append(v)graph[v].append(u)
start_node, end_node = map(int, input().split())# 计算危险系数
result = calculate_danger_coefficient(graph, start_node, end_node)
print(result)