题目描述
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。
请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible。
注意:图中可能 存在负权回路 。
输入格式
第一行包含三个整数n,m,k。
接下来m行,每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
输出格式
输出一个整数,表示从1号点到n号点的最多经过k条边的最短距离。
如果不存在满足条件的路径,则输出“impossible”。
数据范围
1≤n,k≤500,
1≤m≤10000,
任意边长的绝对值不超过10000。
样例
输入样例:
3 3 1
1 2 1
2 3 1
1 3 3
输出样例:
3
算法1
ballman-ford
当负环在1号点到n号点的路径上时,最短路径不存在
遍历所有边,a,b,w。不一定要用邻接表存,这里用结构体来存储
主要用来处理有边数限制的最短路问题
python 代码
#当负环在1号点到n号点的路径上时,最短路径不存在
import copy
class edge(): #边的结构体
def __init__(self,a,b,w):
self.a = a #边的起点
self.b = b #边指向的点
self.w = w #边的长度
def bellman_ford():
dist[1] = 0
for i in range(k): #最多经过k条边
prev_dist = copy.deepcopy(dist) #备份上一次更新的边,为了防止串联更新,导致第k层循环之后找到一个边数大于k的路径。用这个备份更新所有其他的边
for j in range(m): #遍历所有的边
e = edges[j]
dist[e.b] = min(dist[e.b], prev_dist[e.a] + e.w); #更新最短路径
if dist[n] > 0x3f3f3f3f/2: #这里不写 == float('inf'),因为有负环(权重为x)的存在,n可能无法到达,但被更新为inf-x,因此只要判断大于一个很大的数就行了
return "impossible"
else:
return dist[n]
if __name__ == "__main__":
n,m,k = map(int,input().split()) #n个点,m条边
N = 510
dist = [float('inf')] * N #存储所有边的数组
edges = []
for i in range(m):
a,b,w = map(int,input().split())
edges.append(edge(a,b,w))
print(bellman_ford())
兄弟你没有填邀请码可以填一个,都可以得AC币!嘿嘿,谢谢兄弟
我的邀请码是:GUDFH