负环-P3385-P2136
通过选择标签,洛谷刷一个类型的题目还是很方便的
模版题P3385
P3385 【模板】负环 - 洛谷
T=int(input())def bellman(n,edges,sta):INF=float('inf')d=[INF]*(n+1)d[sta]=0for i in range(n-1):for u,v,w in edges:ncost=d[u]+wif ncost<d[v]:d[v]=ncostfor u,v,w in edges:ncost=d[u]+wif ncost<d[v]:return 1return 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]+wif 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 Nonereturn dd1=bellman(n,edges,1) #靠近是相互的:可以起始从1开始
d2=bellman(n,edges,n) #也可以从n到1if 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])
'''