差分约束建图总结

没有概念,233,直接进入主题:

一般引入源点 s s s,令 x s = 0 x_s=0 xs=0,即 d i s [ s ] = 0 dis[s] = 0 dis[s]=0

不等式转化建图
x u + w ≥ x v x_u + w \geq x_v xu+wxv a d d ( u , v , w ) add(u, v, w) add(u,v,w)
x u + w > x v x_u + w > x_v xu+w>xv x u + ( w − 1 ) ≥ x v x_u + (w - 1) \geq x_v xu+(w1)xv a d d ( u , v , w − 1 ) add(u, v, w - 1) add(u,v,w1)
x u = x v x_u = x_v xu=xv x u + 0 ≥ x v , x v + 0 ≥ x u x_u + 0 \geq x_v, x_v + 0 \geq x_u xu+0xv,xv+0xu a d d ( u , v , 0 ) , a d d ( v , u , 0 ) add(u, v, 0), add(v, u, 0) add(u,v,0),add(v,u,0)
x u ≥ c x_u \geq c xuc x u − c ≥ x s x_u - c \geq x_s xucxs a d d ( u , s , − c ) add(u, s, -c) add(u,s,c)
x u ≤ c x_u \leq c xuc x s + c ≥ x u x_s + c \geq x_u xs+cxu a d d ( s , u , c ) add(s, u, c) add(s,u,c)
x u x v ≥ w \cfrac{x_u}{x_v} \geq w xvxuw l o g x u − l o g x v ≥ l o g w logx_u - logx_v \geq logw logxulogxvlogw a d d ( u , v , − l o g w ) add(u, v, -logw) add(u,v,logw)

① 无解:存在负环 x v 1 , x v 2 , ⋯   , x v k x_{v1}, x_{v2}, \cdots, x_{vk} xv1,xv2,,xvk,将负环上的边所代表的不等式组取出,即 { x v 1 + w 1 ≥ x v 2 x v 2 + w 2 ≥ x v 3 ⋯ x v k + w k ≥ x v 1 \begin{cases} x_{v1} + w_1 \geq x_{v2} \\ x_{v2} + w_2 \geq x_{v3} \\ \quad \quad\cdots\\ x_{vk} + w_k \geq x_{v1} \end{cases} xv1+w1xv2xv2+w2xv3xvk+wkxv1
不等式相加,得 ∑ i = 1 k w i ≥ 0 \sum\limits_{i=1}^{k} w_i \geq 0 i=1kwi0,而负环代表 ∑ i = 1 k < 0 \sum\limits_{i=1}^{k} \lt 0 i=1k<0

附一个 b f s bfs bfs 版的 S P F A SPFA SPFA 判负环:

int spfa(){
 
    queue<int> q;
    for(int i = 0; i <= n; ++i){
 
        dis[i] = oo;
        num[i] = vis[i] = 0;
    }
    dis[0] = 0, q.push(0), vis[0] = num[0] = 1;
    while(!q.empty()){
 
        int u = q.front(); q.pop(); vis[u] = 0;
        for(auto &e : G[u]){
 
            int v = e.second, w = e.first;
            if(dis[v] > dis[u] + w){
 
                dis[v] = dis[u] + w, num[v] = num[u] + 1;
                if(num[v] > n + 1) return 1; // 结点编号 0 ~ n,共 n + 1 个
                if(!vis[v]) q.push(v), vis[v] = 1;
            }
        }
    }
    return 0;
}

② 有解情况,跑最短路后, x i = d i s [ i ] x_i = dis[i] xi=dis[i] 即为一组可行解,且为最大值解。(如 x s + c ≥ x u x_s + c \geq x_u xs+cxu s → u s \rightarrow u su 连权值 c c c 的边,松弛后 x u = c x_u = c xu=c

 
附一道题:https://codeforces.com/gym/102394/problem/A

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值