差分约束建边方法

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])
相关推荐
im_AMBER29 分钟前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
笨笨饿35 分钟前
#79_NOP()嵌入式C语言中内联汇编宏的抽象封装模式研究
linux·c语言·网络·驱动开发·算法·硬件工程·个人开发
风萧萧19991 小时前
问答样例如何在RAG问答中使用?
算法
七夜zippoe1 小时前
DolphinDB分区策略:HASH分区与COMPO分区
算法·哈希算法·hash·dolphindb·compo
沪漂阿龙2 小时前
程序员面试技术爆款文:2026大厂算法通关手册——从零基础到LeetCode刷穿,这一篇就够了
算法·leetcode·面试
rit84324993 小时前
基于博弈论的小区分簇算法MATLAB实现
开发语言·算法·matlab
华清远见成都中心3 小时前
C 语言内存管理深度解析:malloc/free 与嵌入式堆栈分配策略
java·c语言·算法
一行代码一行诗++3 小时前
关系操作符
算法
生成论实验室4 小时前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》第五章 事:行在时空中的具体化
人工智能·算法·架构·知识图谱·创业创新
Liangwei Lin4 小时前
LeetCode 283. 移动零
算法