差分约束建边方法

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])
相关推荐
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
Coovally AI模型快速验证4 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
可为测控4 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨5 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
BoBoo文睡不醒5 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end6 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
CM莫问7 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别
sz66cm7 小时前
LeetCode刷题 -- 45.跳跃游戏 II
算法·leetcode