【专题】图论

【专题】图论

1、蓝桥王国(Dijstra算法模板题)

Dijstra算法:从一个节点到达其他所有节点的最短路径【一对多】。

蓝桥王国有N个建筑和M条单向通道,每条通道都连接两个建筑,每个建筑都有自己的编号,分别为1~N(其中皇宫编号为1)。国王想让小明回答从皇宫到每个建筑的最短路径是多少。

输入描述

第一行输入n,m。

第2到M+1行每行有三个正整数u,v,w。表示 u -> v 之间存在一条距离为w的路

输出描述

输出一行,共N个数,分别表示从皇宫到编号为1~N建筑的最短距离

python 复制代码
import heapq  # 导入堆


def dij(s):
    done = [0 for i in range(n + 1)]  # 记录是否处理过
    hp = []  # 堆
    dis[s] = 0
    heapq.heappush(hp, (0, s))  # 入堆,小顶堆
    while hp:
        u = heapq.heappop(hp)[1]  # 出堆元素结点
        if done[u]:  # 当前结点处理过
            continue
        done[u] = 1
        for i in range(len(G[u])):  # 遍历当前结点的邻居
            v, w = G[u][i]
            if done[v]: continue
            dis[v] = min(dis[v], dis[u] + w)  # 更新当前结点邻居的最短路径
            heapq.heappush(hp, (dis[v], v))


n, m = map(int, input().split())
s = 1  # 从1开始访问
G = [[] for i in range(n + 1)]  # 邻接表存储
inf = 2 ** 50
dis = [inf] * (n + 1)  # 存储距离
for i in range(m):  # 存边,这里是单向边
    u, v, w = map(int, input().split())
    G[u].append((v, w))  # 记录结点u的邻居和边长

dij(s)
for i in range(1, n + 1):
    if dis[i] == inf:
        print("-1", end=' ')
    else:
        print(dis[i], end=' ')
---------------------------------------------
输入:
	3 3
    1 2 1
    1 3 5
    2 3 2
输出:0 1 3 
---------------------------------------------

2、蓝桥公园 (Floyd算法模板题)

Floyd算法:所有点对之间的最短路径【多对多】。

小明喜欢观景,于是今天他来到了蓝桥公园。

已知公园有 N 个景点,景点和景点之间一共有 M 条道路。小明有 Q 个观景计划,每个计划包含一个起点 st 和一个终点 ed,表示他想从 st 去到 ed。但是小明的体力有限,对于每个计划他想走最少的路完成,你可以帮帮他吗?

输入描述

输入第一行包含三个正整数 N,M,Q

第 2 到 M+1 行每行包含三个正整数 u,v,w,表示 u↔v 之间存在一条距离为 w 的路。

第 M+2 到 M+Q−1 行每行包含两个正整数 st,ed,其含义如题所述。

输出描述

输出共 QQ 行,对应输入数据中的查询。若无法从 st 到达 ed 则输出 −1。

python 复制代码
def floyd():
    global dp
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            for k in range(1, n + 1):
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])


n, m, q = map(int, input().split())
inf = 2 ** 120
dp = [[inf] * (n + 1) for i in range(n + 1)]
choice = []
for i in range(m):
    u, v, w = map(int, input().split())
    dp[u][v] = w
    dp[v][u] = w
for i in range(q):
    s, d = map(int, input().split())
    choice.append((s, d))
floyd()
for s, d in choice:
    if dp[s][d] != inf:
        print(dp[s][d])
        continue
    print(-1)
---------------------------------------------
输入:
    3 3 3
    1 2 1
    1 3 5
    2 3 2
    1 2
    1 3
    2 3
输出:
	1
    3
    2
---------------------------------------------
相关推荐
巨可爱熊24 分钟前
高并发内存池(定长内存池基础)
linux·运维·服务器·c++·算法
爱数模的小驴2 小时前
2025 年“认证杯”数学中国数学建模网络挑战赛 C题 化工厂生产流程的预测和控制
深度学习·算法·计算机视觉
序属秋秋秋4 小时前
算法基础_数据结构【单链表 + 双链表 + 栈 + 队列 + 单调栈 + 单调队列】
c语言·数据结构·c++·算法
apcipot_rain5 小时前
【密码学——基础理论与应用】李子臣编著 第五章 序列密码 课后习题
算法·密码学
不要不开心了5 小时前
sparkcore编程算子
pytorch·分布式·算法·pygame
88号技师5 小时前
【2024年最新IEEE Trans】模糊斜率熵Fuzzy Slope entropy及5种多尺度,应用于状态识别、故障诊断!
人工智能·算法·matlab·时序分析·故障诊断·信息熵·特征提取
清同趣科研5 小时前
R绘图|6种NMDS(非度量多维分析)绘图保姆级模板——NMDS从原理到绘图,看师兄这篇教程就够了
人工智能·算法
杜小暑5 小时前
冒泡排序与回调函数——qsort
c语言·算法·排序算法
徵6865 小时前
代码训练day27贪心算法p1
算法·贪心算法
Nigori7_7 小时前
day32-动态规划__509. 斐波那契数__70. 爬楼梯__746. 使用最小花费爬楼梯
算法·动态规划