关键词:单源最短路径、源点s、能检测负权环、O(n*m)、松弛
/*
n: 点数
m: 边数
d[n]: 当前点到源点的最短路径
u[m]: 当前边的起点
v[m]: 当前边的终点
w[m]: 当前边的权值
i u v w
0 1 1 0 自己到自己为0
1 2 2 0
.
m-2 4 2 3 4到2的权值为3
m-1 3 2 2 3到2的权值为2
思想:对每条边进行遍历,一共迭代n-1次,
判断(当前边的起点的最短路径d[u[i]] + 边的权值w[i])是否小于当前边终点的最短路径d[v[i]],
如果小于,则更新终点的最短路径d[v[i]]=d[u[i]]+w[i]
初始化:
d[0]=0, d[其他]=无穷大,边的各值
*/
def bellman():
flag=0
for _ in range(n-1): //迭代n-1次
check=0
for i in range(m): //对每条边松弛
if d[v[i]] > d[u[i]]+w[i]:
d[v[i]] = d[u[i]]+w[i] //松弛,修正
check=1
if check==0: //在本次迭代中没有改变,则没必要继续了
break
for j in range(m): //检查是否有负权环路
if d[v[i]] > d[u[i]]+w[i]:
flag=1
if flag==1:
print("负环")