通过选择标签,洛谷刷一个类型的题目还是很方便的
模版题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])
'''
 
 
                



















