怎么搞差分约束?

差分约束是用来解多个不等式中一个什么玩意儿的MAX或MIN 或者是这么一大堆式子有没有解

v - u > x     巴拉巴拉好多这样的式子

看一下最短路是如何运作的 

在一张已经维护好的图上 有dis[v]<=dis[u]+way[u][v];

把上面的式子Duang Duang Duang一顿转换后得到 

u - v < -x

u < v + (- x)

实现到图上就是 addedge( u, v , -x)  从u到v连一条边 长度为dis 表示从v 至少比 u 大 -x;

(其实这里理解了的话应该会感觉很这种做法很聪明)

那怎么判这些式子成不成立?

在原式之中可能会发现一些特别蠢的式子像 x>y   y>z   z>x 这很明显是无解的

建好图之后表现在图上就是 有个正环或是负环 (0环没事 可以自己理解一下

看到这里应该可以了解到 如果你建的不是一张DAG 那它无解(环为0时除外

代码实现就是跑个spfa判个环完事

bool vis[N];
bool spfa(int u){
    vis[u]=1;
    for(int i=head[u];i;i=edge[i].nxt){
        if(dis[edge[i].to]<dis[u]+edge[i].dis){
            dis[edge[i].to]= dis[u]+edge[i].dis;
            if(vis[edge[i].to]) return 0;
            if(!spfa(edge[i].to) ) return 0;
        }
    }
    vis[u]=0;
    return 1;
}
int main(){
    for(int i=1;i<=n;i++)}{
        dis[i]=-INF ;
        addedge(0,i,0);
    }
    if(spfa(0))cout<<"Yes";
    else cout<"No";
    return 0;
}

有个板子叫 小K的农场 (超链接写好了哦)

 

差分约束还可以解决一些 像什么在确定了一个值的基础上求另一个点的MIN / MAX;

板子 种树 (超链接点击即可) 当然了这个题贪心也能过 但是用来差分入门也很好

 

posted @ 2019-02-23 11:59  SIN_XIII  阅读(235)  评论(0编辑  收藏  举报