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

蓝桥杯真题-危险系数DF

抗日战争时期,冀中平原的地道战曾发挥重要作用。
地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
我们来定义一个危险系数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 #引入双端队列、特殊字典dafaultdict

def 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 True
        for 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 -1
    danger_count = 0
    for node in graph.keys():
        if node not in [start, end]:
            # 去除节点node,观察start,end是否连接来确定node是否是中间节点
            if not is_connected(graph, start, end, node): 
                danger_count += 1
    return 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/126344.html

相关文章:

  • L2-051 满树的遍历
  • Java的基本语法(1)
  • 彻底改变我 React 开发方式的组件模式
  • 三格电子上新款——欧姆龙 CJ/CP系列 PLC 串口转网口
  • for循环的优化方式、循环的种类、使用及平替方案。
  • LEARNING DYNAMICS OF LLM FINETUNING【论文阅读笔记】
  • 如何深入理解protobuf
  • 小型实验室数控机床-迷你型数控加工中心|CNC数控车床
  • 软考 中级软件设计师 考点知识点笔记总结 day11 文件管理 设备管理
  • 51电子表
  • AI 之 LLM(大语言模型)是如何生成文本的!
  • 力扣经典算法篇-11-除自身以外数组的乘积(总乘积求除法,左右乘积法)
  • 探索 C++ 中的 const 关键字
  • 美食推荐小程序
  • OpenFeign 的实现原理详解
  • 探索在视频深度伪造中的细微的表情变化或对特定面部特征的小改动检测方法
  • 使用numpy构建逻辑回归模型及训练流程
  • 关于哈希冲突的讨论
  • TDOA定位算法核心优势解析(2025年更新)
  • 【Java面试系列】Spring Cloud微服务架构中的分布式事务实现与性能优化详解 - 3-5年Java开发必备知识
  • netty中的ChannelHandler详解
  • 【DB2】备份失败SQL1762N
  • python相关面试题
  • 算法系列——无监督学习——15.混合高斯分布
  • 光学工程考研调剂推荐
  • c++将jpg转换为灰度图
  • APCC:CloudberryDB和Greenplum数据库的管理利器
  • LLM_基于OpenAI的极简RAG
  • Django从零搭建卖家中心注册页面实战
  • 什么是 ForkJoinPool