设为首页 加入收藏

TOP

zoj2770 差分约束问题
2015-07-20 17:58:21 来源: 作者: 【 】 浏览:2
Tags:zoj2770 差分 约束 问题

总的开说差分约束问题就是给出一系列不等式然后求问某一式子的最大值或者最小值。

差分约束问题详解:

比如有这样一组不等式:

X1 - X2 <= 0
X1 - X5 <= -1
X2 - X5 <= 1
X3 - X1 <= 5 不等式组(1)
X4 - X1 <= 4
X4 - X3 <= -1
X5 - X3 <= -3
X5 - X4 <= -3

全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。
这个不等式组要么无解,要么就有无数组解。因为如果有一组解{X1, X2, ..., Xn}的话,那么对于任何一个常数k,{X1 + k, X2 + k, ..., Xn + k}肯定也是一组解,因为任何两个数同时加一个数之后,它们的差是不变的,那么这个差分约束系统中的所有不等式都不会被破坏。

差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。即对于任何一条边u -> v,都有:

d(v) <= d(u) + w(u, v) \

其中d(u)和d(v)是从源点分别到点u和点v的最短路径的权值,w(u, v)是边u -> v的权值。
显然以上不等式就是d(v) - d(u) <= w(u, v)。这个形式正好和差分约束系统中的不等式形式相同。于是我们就可以把一个差分约束系统转化成一张图,每个未知数Xi对应图中的一个顶点Vi,把所有不等式都化成图中的一条边。对于不等式Xi - Xj <= c,把它化成三角形不等式:Xi <= Xj + c,就可以化成边Vj -> Vi,权值为c。
<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1Nq9qMGizby1xMqxuvLTprjD0+vEv7Hquq/K/bXEt/u6xc/gzayjrLy0xL+x6rqvyv3Oqj49LLK7tcjKvbXEt/u6xdKy06a4w7Hkzqo+PSzU2bj5vt2yu7XIyr29qMGizbyjuzxicj4KPC9wPgo8cD7P4Le0o6zI57n7ysc8PaOssru1yMq90rLTprjDyKuyv7Hkzqo8PaOs1Nm9qMGizbyjuzxicj4KPC9wPgo8cD6jqNK71sLQ1KOpt/u6xcrHPj278tXfPD2jrLKit8c8us0+PC9wPgo8cD48YnI+CjwvcD4KPHA+yc/OxL7NvbLBy8jnus64+b7dsru1yMq9vajBos28o6zExLW9tde6zc7KzOK1xLK7tcjKvbXE1+608yYjMjA1NDA7u/LV39fu0KEmIzIwNTQwO9PQyrLDtLnYwarE2KO/PC9wPgo8cD7I58zixL/SqsfzZCh2KSAtIGQodSm1xNfu0KEmIzIwNTQwO6Osv8nS1Nequ7uzyWQodikgLSBkKHUpID49TSy2+Lj5vt3Jz87EtcPWqk3OqnUtPna1xMioJiMyMDU0MDuhozwvcD4KPHA+0qrP68nPyr3X07PJwaKjrNTy06bT0G1pbihkKHYpIC0gZCh1KSk+PW1heChNKaOsvLTXqrPJwcvH83UtPnbX7rOktcTCt762vLTKvdfTtcTX7tChJiMyMDU0MDs8L3A+CjxwPs/gzayjrMjnufvH82QodikgLSBkKHUptcTX7rTzJiMyMDU0MDujrNXi06a4w8fzdS0+drXE1+7QocK3vrY8L3A+CjxwPrbU09qy7rfWsru1yMq9o6xhIC0gYiA8PSBjIKOsx/O1xMrH1+62zMK3o6y1w7W9tcTKx9futPMmIzIwNTQwO6O7PC9wPgo8cD621NPasu631rK7tcjKvSBhIC0gYiA+PSBjCiCjrMfztcTKx9fus6TCt6OstcO1vbXEysfX7tChJiMyMDU0MDuhozwvcD4KPHA+PHU+PGJyPgo8L3U+PC9wPgo8cD48dT652NPasrmyu7K5s+TUtLXjo7o8L3U+PC9wPgo8cD48dT61sWQodikgus1kKHUptrzS0dTazbzW0LTm1NqjrNTysrvQ6NKqsrmz5NS0teOhozwvdT48L3A+CjxwPjx1PrWxzbzDu9PQxL+x6tS0teO1xMqxuvK78tXf0OjSqsGsvdPV+7j2zby1xMqxuvKjrNTy0OjSqrK5s+TUtLXjoaOyorK5s+S52M+1oaM8L3U+PC9wPgo8cD48YnI+CjwvcD4KPHA+yOe5+8281tC05tTauLrIqCYjMjA1NDA7u9jCt6Os1PLH87P2wLS1xNfutszCt762w7vT0NLi0uWho9Kyvs3Kx8u1sru1yMq9zt694qGjy/nS1NKqtNPKx7fx09C4usioJiMyMDU0MDu72MK3vfi2+MXQts/T0M7eveKhozwvcD4KPHA+PGJyPgo8L3A+CjxwPnpvasfz1+7QoSYjMjA1NDA7o7qjqLLut9ayu7XIyr1hLWI+PWOjrMfz1+6zpMK3o6y1w7W91+7QoSYjMjA1NDA7o6k8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; int dist[1010]; int n,m,a,b,c; struct edge { int to,cost; }cur; vector vec[1010]; inline void read(int &m)//int { int x=0,f=1;char ch=getchar();//int while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} m=x*f; } bool spfa() //(差分不等式a-b>=c,求最长路,得到最小值) { int cnt[1010];bool vis[1010]; for(int i=1;i<=n;i++) dist[i]=-1111111111; memset(cnt,0,sizeof(cnt)); memset(vis,0,sizeof(vis)); vis[0]=1; dist[0]=0; queue que; que.push(0); while(!que.empty()) { int v=que.front(); que.pop(); if(++cnt[v]>=n) return 0; vis[v]=0; for(int i=0;i =0 S(i-1)-Si<=0 cur.to=i-1; cur.cost=-a; vec[i].push_back(cur); //Ai<=a Si-S(i-1)<=0 cur.to=i; cur.cost=0; vec[0].push_back(cur); //Si-S0>=0 //0点为新添上去的源点,与其他节点建立关系 } for(int i=1;i<=m;i++) { read(a),read(b),read(c); cur.to=b; cur.cost=c; vec[a-1].push_back(cur); //Sb-Sa-1>=c } if(spfa()) printf("%d\n",dist[n]); else printf("Bad Estimations\n"); } return 0; }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj1827A Bunch Of Monsters(贪心) 下一篇HDU 4902 Matrix multiplication

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: