差分约束建边方法

1.求最大值,用最短路,不等式转化成 a <= b + c形式,从b向a建立权值为c的边g[b].append((a,c))

2.求最小值,用最长路,不等式转化成a >= b + c形式,从b向a建立权值为c的边

python 复制代码
import sys
from collections import defaultdict, deque

from math import inf, sqrt

RI = lambda: int(sys.stdin.readline().strip())
RS = lambda: sys.stdin.readline().strip()
RII = lambda: map(int, sys.stdin.readline().strip().split())
RILIST = lambda: list(RII())

g = defaultdict(list)
n,ml,md = RII()
# 求最大值,用最短路,a <= b + c形式表示
# 按顺序排列,要求 i <= (i + 1) + 0
for i in range(1,n + 1):
    g[i + 1].append((i,0))
# b - a <= l  b <= a + l
for _ in range(ml):
    a,b,l = RII()
    if b < a:
        a,b = b,a
    g[a].append((b,l))
# b - a >= d  a <= b - d
for _ in range(md):
    a,b,d = RII()
    if b < a:
        a,b = b,a
    g[b].append((a,-d))

dis = [inf]*(n + 1)

def spfa(k):
    # 最短路,找负环
    global dis
    dis = [inf]*(n + 1)
    cnt = [0]*(n + 1)
    st = [0]*(n + 1)
    q = deque()
    for i in range(1,k + 1):
        dis[i] = 0
        st[i] = 1
        q.append(i)
    while q:
        u = q.popleft()
        st[u] = 0
        for v,w in g[u]:
            if dis[v] > dis[u] + w:
                dis[v] = dis[u] + w
                cnt[v] = cnt[u] + 1
                if cnt[v] >= n:
                    return True
                if not st[v]:
                    st[v] = 1
                    q.append(v)
    return False

if spfa(n):
    print(-1)
else:
    spfa(1)
    if dis[n] == inf:
        print(-2)
    else:
        print(dis[n])
相关推荐
CoderCodingNo1 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
大闲在人1 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
小熳芋1 小时前
443. 压缩字符串-python-双指针
算法
Charlie_lll1 小时前
力扣解题-移动零
后端·算法·leetcode
chaser&upper1 小时前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法
weixin_499771551 小时前
C++中的组合模式
开发语言·c++·算法
iAkuya2 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼2 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck2 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆2 小时前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型