P5960 【模板】差分约束算法
题目链接:
思路:
题目要求可行解即可,我们可以用最长路或者最短路来求,这里我选用最长路的方式来求一组最小值解,最长路的建边方式是由小到大建边
代码如下:
import sys
from collections import deque
inf = 1 << 31
N = 5010
M = 15010
h = [-1] * N
w = [0] * M
ne = [0] * M
e = [0] * M
idx = 0
dist = [-inf] * N
st = [False] * N
cnt = [0] * N
def add(a, b, c):
global idx
e[idx] = b
w[idx] = c
ne[idx] = h[a]
h[a] = idx
idx += 1
def spfa():
q = deque()
dist[0] = 0
q.append(0)
st[0] = True
while q:
t = q.pop()
st[t] = False
i = h[t]
while i != -1:
j = e[i]
if dist[j] < dist[t] + w[i]:
dist[j] = dist[t] + w[i]
cnt[j] = cnt[t] + 1
if cnt[j] >= n + 1: return False
if not st[j]:
st[j] = True
q.append(j)
i = ne[i]
return True
n, m = map(int, sys.stdin.readline().split())
for _ in range(m):
a, b, c = map(int, sys.stdin.readline().split())
add(a, b, -c) # a - b <= c, a - c <= b
for i in range(1, n + 1): add(0, i, 0)
if not spfa(): print("NO")
else:
for i in range(1, n + 1): print(dist[i], end = )
