通过选择标签,洛谷刷一个类型的题目还是很方便的
模版题P3385
P3385 【模板】负环 - 洛谷
T=int(input())
def bellman(n,edges,sta):
INF=float('inf')
d=[INF]*(n+1)
d[sta]=0
for i in range(n-1):
for u,v,w in edges:
ncost=d[u]+w
if ncost<d[v]:
d[v]=ncost
for u,v,w in edges:
ncost=d[u]+w
if ncost<d[v]:
return 1
return 0#得第n轮所有边判断完才能下决定
for _ in range(T):
n,m=map(int,input().split())
edges=[]
for i in range(m):
u,v,w=map(int,input().split())
if w>=0:
edges.append((u,v,w))
edges.append((v,u,w))
else:
edges.append((u,v,w))
flag=bellman(n,edges,1)
if flag:
print('YES')
else:
print('NO')
P2136 拉近距离
P2136 拉近距离 - 洛谷
注意点:
1.“拉近距离”,所以存入的边权是 -w
2.靠近是相互的,所以可以是从点1到点n,也可以是从点n到点1
n,m=map(int,input().split())
edges=[]
for i in range(m):
u,v,w=map(int,input().split())
edges.append((u,v,-w))
def bellman(n,edges,sta):
INF=float('inf')
d=[INF]*(n+1) #注意输入起始从1开始,所以得n+1 ,初始化无边
d[sta]=0 #d数组是从sta到各点的最短路径,自己到自己为0
#n-1轮松弛
for i in range(n-1):
for u,v,w in edges:
if d[u]!=INF:
ncost=d[u]+w
if ncost<d[v]:
#从sta有边到u ,而且新路径更短
d[v]=ncost
#第n轮:检测负环
for u,v,w in edges:
if d[u]!=INF and d[u]+w<d[v]:
#print('Forever love')
return None
return d
d1=bellman(n,edges,1) #靠近是相互的:可以起始从1开始
d2=bellman(n,edges,n) #也可以从n到1
if d1 and d2:
if d1[n]<d2[1]:
print(d1[n])
else:
print(d2[1])
else:
print('Forever love')
'''
elif d1:
print(d1[n])
elif d2:
print(d2[1])
'''