差分约束建边方法

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])
相关推荐
中文英文-我选中文几秒前
排序算法的理解
算法·排序算法
我明天再来学Web渗透21 分钟前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法
数据分析螺丝钉1 小时前
力扣第240题“搜索二维矩阵 II”
经验分享·python·算法·leetcode·面试
no_play_no_games1 小时前
「3.3」虫洞 Wormholes
数据结构·c++·算法·图论
五味香1 小时前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
毕小宝1 小时前
逻辑回归(下): Sigmoid 函数的发展历史
算法·机器学习·逻辑回归
小叮当爱咖啡2 小时前
DenseNet算法:口腔癌识别
算法
希望有朝一日能如愿以偿2 小时前
算法(食物链)
算法
鱼跃鹰飞2 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试
summ1ts2 小时前
组合数求法汇总
c++·数学·算法·离散数学·组合数学