图论:


【阿良的算法之路】图论最短路算法模板

【模板】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)

【阿良的算法之路】图论最短路算法模板相关推荐

  1. spfa算法_10行实现最短路算法——Dijkstra

    今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...

  2. 超详细!图论最短路算法与极简c++代码(配题目)

    最短路算法知识结构图 /* 最短路问题{单源最短路{1.所有边权都是正数{1.朴素Dijkstra算法 O(n^2) 适用于稠密图2.堆优化的Dijkstra O(mlog(n)) 适用于稀疏图}2. ...

  3. 算法小讲堂之最短路算法(Floyd+bellman+SPFA+Dijkstra)

    前言 如果你对图论相关知识一点也没有,那么建议您先去了解这些知识:https://acmer.blog.csdn.net/article/details/122310835,然后就可以快乐的学习最短路 ...

  4. 【啊哈!算法】算法7:Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&quo ...

  5. ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)

    模板 时间复杂是 O(n2+m), n表示点数,m 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存 ...

  6. 啊哈算法中的Dijkstra最短路算法(好理解!!!)

    tip:需要电子书的小伙伴可以留言或者私信哦~~ 模板: #include <stdio.h> int main() {int e[10][10],dis[10],book[10],i,j ...

  7. 图论--最短路--SPFA模板(能过题,真没错的模板)

    [ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...

  8. 图论--最短路-- Dijkstra模板(目前见到的最好用的)

    之前的我那个板子,老是卡内存,不知道为什么,我看别人过的那个题都是结构体,我就开始对自己板子做了修改,然后他奶奶的就过了,而且速度也提高了,内存也小了.(自从用了这个板子,隔壁小孩馋哭了)也不知道为啥 ...

  9. dijkstra算法matlab程序_编程习题课 | 用最短路算法为你的小地图导航

    简介:路网拓扑的正确导入方式,运筹学算法的完整实战案例,最详细的代码讲解与分享. 引言:在研究路径选择和流量分配等交通问题时,常常会用到最短路算法.用最短路算法解决交通问题存在两个难点:一.算法的选择 ...

最新文章

  1. 语音识别系统及科大讯飞最新实践
  2. 野指针出现的三种情况
  3. 央视网报道“手机就能打到拖拉机”,网友直呼“想种地了”
  4. 简单配置局域网FTP
  5. 流媒体服务器搭建实例——可实现录音,录像功能
  6. ubuntu下使用screen用不关闭
  7. 使用Python绘制淘宝商品评论词云图
  8. powerbi 线性回归_精选 | 实用炫酷的Power BI自定义图表
  9. SqlDbx远程链接DB2数据库
  10. 618电商大数据分析可视化报告
  11. android相机预览拍照功能实现
  12. 1.3 网页数据抓取
  13. 【Java】Spring 教程
  14. NLI:Natural Language Inference
  15. TIA西门子博途V18安装教程及注意事项
  16. 系统安装报错:dracut-initqueue : Warning: dracut-initqueue timeout - starting timeout scripts
  17. MySQL数据库——视图
  18. Android系统开发 默认壁纸的定制 主题风格的开发及定制 DDMS 常用adb 命令 抓取Log
  19. 如何在matlab中建立pid神经网络,神经网络PID控制及其Matlab仿真
  20. Mac电脑上的阅读神器 Koodo Reader for Mac

热门文章

  1. vivoy73s和oppoa92s哪个好
  2. 今天蚯蚓在园子里安家落户
  3. 个人对未来Python项目的展望
  4. jsp70026企业财务员工工资人事管理系统
  5. mybatis的parameterType属性那些情况下要写 哪些情况下不用写
  6. spring data rest 不隐藏主键id
  7. HTTP错误汇总(404、302、200……)今天web报302错误,刷新后再试没问题,找度娘问问,顺便记点东西
  8. 实现HTML5的video标签视频播放器
  9. YLBs CAPTCHA - 签到题_N种花式签到,任你活动千万场,总有一款适合你
  10. java连接SQL server(jdbc)