【阿良的算法之路】图论最短路算法模板
图论:
【阿良的算法之路】图论最短路算法模板
【模板】dirjkstra单源最短路径
【模板】Bellman-Ford多源最短路
【模板】Spfa求最短路
【模板】Spfa判断负环
【模板】Floya
【模板】Kruskal最小生成树
【模板】dirjkstra单源最短路径
参考题目:
题目描述
给定一个 nn 个点,mm 条有向边的带非负权图,请你计算从 ss 出发,到每个点的距离。
数据保证你能从 ss 出发到任意点。
输入格式
第一行为三个正整数 n, m, sn,m,s。 第二行起 mm 行,每行三个非负整数 u_i, v_i, w_iui,vi,wi,表示从 u_iui 到 v_ivi 有一条权值为 w_iwi 的有向边。
输出格式
输出一行 nn 个空格分隔的非负整数,表示 ss 到每个点的距离。
————————————————
import heapq
from collections import defaultdict
# 核心代码
def dirjkstra():# 各节点到start的最短距离dirs = [float('inf')] * (n + 1)dirs[start] = 0# 已用节点,比set还快20% 所有没有释放Falseseen = [False] * (n + 1)pq = []heapq.heappush(pq, (0, start))# BFSwhile pq:# 获取_, u = heapq.heappop(pq)# 该节点是否用过if seen[u]:continueelse:seen[u] = True# 找到邻接节点nodeList = graph[u]for v, w in nodeList:t = dirs[u] + wif t < dirs[v]:dirs[v] = t# 如果该邻接节点没有访问过才把该最短边加进去if not seen[v]:heapq.heappush(pq, (t, v))if dirs[-1] == float('inf'):return -1else:return dirs[-1]# 输入
n, m = map(int, input().split())# 初始化
start = 1# 建图
graph = defaultdict(list)
for _ in range(m):u, v, w = map(int, input().split())graph[u].append((v,w))answer = dirjkstra()
print(answer)
【模板】Bellman-Ford多源最短路
参考题目:
题目描述
给定一个 nn 个点 mm 条边的有向图,图中可能存在重边和自环, 边权可能为负数。
请你求出从 11 号点到 nn 号点的最多经过 kk 条边的最短距离,如果无法从 11 号点走到 nn 号点,输出 impossible
。
注意:图中可能 存在负权回路 。
输入格式
第一行包含三个整数 n,m,kn,m,k。
接下来 mm 行,每行包含三个整数 x,y,zx,y,z,表示存在一条从点 xx 到点 yy 的有向边,边长为 zz。
输出格式
输出一个整数,表示从 11 号点到 nn 号点的最多经过 kk 条边的最短距离。
如果不存在满足条件的路径,则输出 impossible
。
数据范围
1≤n,k≤5001≤n,k≤500,
1≤m≤100001≤m≤10000,
任意边长的绝对值不超过 1000010000。
————————————————
# new_list = list !!当list的值改变了new_list也会随着改变
# 正确做法: new_list = list(list)n, m, k = map(int, input().split())
edgeList = [tuple(map(int, input().split())) for _ in range(m)]
dirs = [float('inf') for _ in range(n + 1)]
dirs[1] = 0
for _ in range(k):back = list(dirs)for u, v, w in edgeList:dirs[v] = min(dirs[v], back[u] + w)
if dirs[-1] == float('inf'):print('impossible')
else:print(dirs[-1])
【模板】Spfa求最短路
题目描述:
给定一个n 个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出1号点到n 号点的最短距离,如果无法从1号点走到n号点,则输出impossible 。数据保证不存在负权回路。
输入格式:
第一行包含整数n和m。接下来m行每行包含三个整数a, y,z,表示存在一条从点α到点g的有向边,边长为z。
输出格式:
输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出impossible。
数据范围:
输入样例:
3 3
1 2 5
2 3 -3
1 3 4
输出样例:
2
————————————————
# 队列存储距离有更新的点
def spfa():dirs = [float('inf')] * (n + 1) # 存储到1节点的最短距离dirs[1] = 0 seen = [False] * (n + 1) # 该节点是否在队列中q = [1]while len(q):u = q.pop(0)seen[u] = Falsefor v, w in g[u]:if dirs[u] + w < dirs[v]:dirs[v] = dirs[u] + w# 如果该邻接节点没有访问过才把该点加进去if not seen[v]:q.append(v)seen[v] = Trueif dirs[-1] == float('inf'):return 'impossible'else:return dirs[-1]# 建边
n, m = map(int, input().split())
g = {x: [] for x in range(1, n + 1)}
for _ in range(m):a, b, w = map(int, input().split())g[a].append((b, w))ans = spfa()
print(ans)
【模板】Spfa判断负环
题目描述:
给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。
请你判断图中是否存在负权回路。
输入格式:
第一行包含整数n和m。
接下来m行每行包含三个整数x, y, z, 表示存在一条从点x到点y的有向边,边长为z。
输出格式:
如果图中存在负权回路,则输出Yes,否则输出No。
数据范围:
输入样例:
3 3
1 2 -1
2 3 4
3 1 -4
输出样例:
Yes
————————————————
from collections import deque, defaultdictdef spfa():dirs = [0] * (n + 1) # 表示的是1到s的最短距离 seen = [False] * (n + 1) # 该节点是否走过cnt = [0] * (n + 1) # 表示的是当前最短路的边的数量q = deque([x for x in range(1, n + 1)])while len(q):u = q.popleft()seen[u] = Falsefor v, w in g[u]:t = dirs[u] + wif t < dirs[v]:dirs[v] = tcnt[v] = cnt[u] + 1if cnt[v] >= n:return Trueif not seen[v]:q.append(v)seen[v] = Truereturn False# 建图模板
n, m = map(int, input().split())
g = defaultdict(list)
for _ in range(m):u, v, w = map(int, input().split())g[u].append((v, w))print("Yes" if spfa() else "No")
【模板】Floya
————————————————
def floyd():for k in range(1, n + 1):for i in range(1, n + 1):for j in range(1, n + 1):dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])return n, m, k = map(int, input().split())#输入
dp = [[float('inf')] * (n + 1) for _ in range(n + 1)]#开dp数组
# d[i][j] 结点i到结点j的最短距离
for i in range(1, n + 1): # 结点i到自己为0dp[i][i] = 0for _ in range(m): # m 条有向边 u, v, w = map(int, input().split())dp[u][v] = min(dp[u][v], w) # 连边中u可能等于v此时选择最小的# 解决重边和自环 都选最小的floyd()for _ in range(k):u, v = map(int, input().split())print('impossible' if dp[u][v]==float('inf') else dp[u][v])
【模板】Kruskal最小生成树
题目描述:
给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。
求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。
给定一张边带权的无向图=(V,E),其中V表示图中点的集合,E表示图中边的集合,n=|V\,m =|E。
由V中的全部n个顶点和E中n―1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图的最小生成树。
输入格式:
第一行包含两个整数n和m。
接下来m行,每行包含三个整数u, v, ww,表示点u和点v之间存在一条权值为w的边。
输出格式:
共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出impossible 。
数据范围:
输入样例:
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
输出样例:
6
————————————————
from collections import defaultdict, dequedef find(x):if not p[x] == x:p[x] = find(p[x])return p[x]n, m = map(int, input().split())
p = [_ for _ in range(n + 1)]
g = []
for _ in range(m):g.append(tuple(map(int, input().split())))
g.sort(key=lambda x:x[2])cnt = 0
res = 0
for u, v, w in g:eu = find(u)ev = find(v)if eu == ev: continuep[ev] = eures += wcnt += 1print('impossible') if not cnt == n - 1 else print(res)
【阿良的算法之路】图论最短路算法模板相关推荐
- spfa算法_10行实现最短路算法——Dijkstra
今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...
- 超详细!图论最短路算法与极简c++代码(配题目)
最短路算法知识结构图 /* 最短路问题{单源最短路{1.所有边权都是正数{1.朴素Dijkstra算法 O(n^2) 适用于稠密图2.堆优化的Dijkstra O(mlog(n)) 适用于稀疏图}2. ...
- 算法小讲堂之最短路算法(Floyd+bellman+SPFA+Dijkstra)
前言 如果你对图论相关知识一点也没有,那么建议您先去了解这些知识:https://acmer.blog.csdn.net/article/details/122310835,然后就可以快乐的学习最短路 ...
- 【啊哈!算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&quo ...
- ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)
模板 时间复杂是 O(n2+m), n表示点数,m 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存 ...
- 啊哈算法中的Dijkstra最短路算法(好理解!!!)
tip:需要电子书的小伙伴可以留言或者私信哦~~ 模板: #include <stdio.h> int main() {int e[10][10],dis[10],book[10],i,j ...
- 图论--最短路--SPFA模板(能过题,真没错的模板)
[ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...
- 图论--最短路-- Dijkstra模板(目前见到的最好用的)
之前的我那个板子,老是卡内存,不知道为什么,我看别人过的那个题都是结构体,我就开始对自己板子做了修改,然后他奶奶的就过了,而且速度也提高了,内存也小了.(自从用了这个板子,隔壁小孩馋哭了)也不知道为啥 ...
- dijkstra算法matlab程序_编程习题课 | 用最短路算法为你的小地图导航
简介:路网拓扑的正确导入方式,运筹学算法的完整实战案例,最详细的代码讲解与分享. 引言:在研究路径选择和流量分配等交通问题时,常常会用到最短路算法.用最短路算法解决交通问题存在两个难点:一.算法的选择 ...
最新文章
- 语音识别系统及科大讯飞最新实践
- 野指针出现的三种情况
- 央视网报道“手机就能打到拖拉机”,网友直呼“想种地了”
- 简单配置局域网FTP
- 流媒体服务器搭建实例——可实现录音,录像功能
- ubuntu下使用screen用不关闭
- 使用Python绘制淘宝商品评论词云图
- powerbi 线性回归_精选 | 实用炫酷的Power BI自定义图表
- SqlDbx远程链接DB2数据库
- 618电商大数据分析可视化报告
- android相机预览拍照功能实现
- 1.3 网页数据抓取
- 【Java】Spring 教程
- NLI:Natural Language Inference
- TIA西门子博途V18安装教程及注意事项
- 系统安装报错:dracut-initqueue : Warning: dracut-initqueue timeout - starting timeout scripts
- MySQL数据库——视图
- Android系统开发 默认壁纸的定制 主题风格的开发及定制 DDMS 常用adb 命令 抓取Log
- 如何在matlab中建立pid神经网络,神经网络PID控制及其Matlab仿真
- Mac电脑上的阅读神器 Koodo Reader for Mac