POJ3169 Layout

题意:

n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0。这些牛的距离存在着一些约束关系:1.有ml组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 <= w。2.有md组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 >= w。问如果这n头无法排成队伍,则输出-1,如果牛[1]和牛[n]的距离可以无限远,则输出-2,否则则输出牛[1]和牛[n]之间的最大距离。

分析:

记第i号牛的位置是d[i]。首先,牛是按照编号顺序排列的,所以有d[i]<=d[i+1]成立。其次,对于每对关系好的牛之间的最大距离限制,都有d[AL]+DL >=d[BL]成立。同样,对于每对关系不好的牛,都有d[AD]+DD<=d[BD]成立。因此,原问题可以转化为在满足这三类不等式的情况下,求解d的d[N] -d[1]的最大值问题。这是线性规划问题,可以使用单源最短路径算法求解。

这些不等式的特点是所有的式子的两边都只出现了1个变量。实际上,图上的最短路问题也可以用这样的形式表示出来。记从起点s出发,到各个顶点v的最短距离为d(v)。因此,对于每条权值为w的边e=(v,u),都有d(v)+w >=d(u)成立。反之,在满足全部这些约束不等式的d中,d(v)-d(s)的最大值就是从s到v的最短距离。需要注意这里不是最小值,而是最大值对应着最短距离。

把原来的问题和最短路问题进行比较就可以发现,两个问题都是完全一样的形式。也就是说,可以通过把原来的问题的每一个约束不等式对应成图中的一条边来构图,然后通过解决最短路问题来解决原问题。首先把顶点编号为1~N,d[i]<=d[i+1]变形为d[i+1]+0>=d[i],因此从顶点i+1向顶点i连一条权值为0的边。同样d[AL]+DL>=d[BL]对应从顶点BL连一条权值为DL的边,d[AD]+DD<=d[BD]对应从顶点BD向顶点AD连一条权值为-DD的边。所求的问题是d[N]-d[1]的最大值,对应为顶点1到顶点N的最短距离。由于图中存在负权边,因此不使用Dijkstra算法而是使用Bellman-Ford算法求解。即使这样复杂度也只有O(N(N+ML+MD))。

code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int maxn = 10000 + 10;
const int INF = 1000000000;
int N, ML, MD;
int AL[maxn], BL[maxn], DL[maxn];
int AD[maxn], BD[maxn], DD[maxn];
int d[maxn];void solve() {fill(d, d+N, INF);d[0] = 0;//用Bellman-Ford算法计算dfor(int k=0; k < N; ++k) {//从i+1到i的权值为0for(int i=0; i+1 < N; ++i) {if(d[i+1] < INF) d[i] = min(d[i], d[i+1]);}//从AL到BL的权值为DLfor(int i=0; i < ML; ++i) {if(d[AL[i]-1] <INF)d[BL[i]-1] = min(d[BL[i]-1], d[AL[i]-1] + DL[i]);}//从BD到AD的权值为-DDfor(int i=0; i < MD; ++i) {if(d[BD[i]-1] < INF) {d[AD[i]-1] = min(d[AD[i]-1], d[BD[i]-1] -DD[i]);}}}int res = d[N-1];if(d[0] < 0) {//存在负圈则无解res = -1;} else if(res == INF) {res = -2;}printf("%d\n", res);
}int main() {int i;while(~scanf("%d%d%d",&N, &ML, &MD)) {for(i=0; i<ML; ++i) {scanf("%d%d%d",&AL[i], &BL[i], &DL[i]);}for(i=0; i<MD; ++i) {scanf("%d%d%d",&AD[i], &BD[i], &DD[i]);}solve();}return 0;
}

用求最短路和最长路解差分约束问题

1)建图后求最短路(对应 <= 的差分约束)

从求最短路后分析开始。求最短路后一定有:d(u) + w(u,v) >= d(v) 转换为:d(v) – d(u) <= w(u,v)。然后这个式子与我们差分约束条件得到的不等式( X(a) - X(b) <= c )相似。

所以得到建图的规则为:一条b到a的边权值为c。

建图后求最短路即为一组解。

2)建图后求最长路(对应 >= 的差分约束)

同上。求最长路后一定得到:d(u) + w(u,v) <= d(v) 转换为:d(v)-d(u)>=w(u,v)。然后对比差分约束条件的不等式( X(a) - X(b) >= c )。

所以得到建图的规则为:一条b到a的边权值为c。

建图后求最长路即为一组解。

POJ3169 Layout , 最短路算法解差分约束问题相关推荐

  1. POJ - 3169 SPFA解差分约束除了有解,负环还有另一种情况

    题意就是有N头牛排成一个直线..有些牛之间互相讨厌..距离必须大于等于某个...有些牛之间相互暧昧..距离必须小于等于某个...牛的前后顺序和编号是一样的...问这些牛最多能排多长.. 比较传统的SP ...

  2. 【UVA11478】Halum (最短路解差分约束)

    题目: Sample Input 2 1 1 2 10 2 1 1 2 -10 3 3 1 2 4 2 3 2 3 1 5 4 5 2 3 4 4 2 5 3 4 2 3 1 0 1 2 -1 Sam ...

  3. 算法复习——差分约束(ssoi种树)

    题目: 题目描述 为了绿化乡村,H 村积极响应号召,开始种树了. H 村里有 n 幢房屋,这些屋子的排列顺序很有特点,在一条直线上.于是方便起见,我们给它们标上 1-n .树就种在房子前面的空地上. ...

  4. UVA 11478 Halum(用bellman-ford解差分约束)

    对于一个有向带权图,进行一种操作(v,d),对以点v为终点的边的权值-d,对以点v为起点的边的权值+d.现在给出一个有向带权图,为能否经过一系列的(v,d)操作使图上的每一条边的权值为正,若能,求最小 ...

  5. POJ1201/ZOJ1508/HDU1384 Intervals(spfa解差分约束问题)

    题意是说给出一些闭区间,这些区间上整点可以选择放一个元素或者不放,但是每个区间都有一个下限,就是说你在这个区间里面的元素个数不能低于这个下限值. 最后要求出最少需要几个元素才能满足每个区间的要求. 建 ...

  6. 【POJ1021】Intervals (最短路解差分约束)

    题目: Sample Input 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 Sample Output 6 题意: 我们选数,每个数只能选一次.给定n个条件[ai,bi]和 ...

  7. 谈SPFA解差分约束最大值最小值的原理...

    自我分析,为什么用SPFA解差分方程,用最短路径求差分方程的最大解:用最长路径求差分方程的最小解. 如果给出的是一组: a2 - a1 <= k1 a3 - a1 <= k2 .... 之 ...

  8. POJ 3159 Candies 差分约束dij

    分析:设每个人的糖果数量是a[i] 最终就是求a[n]-a[1]的最大值 然后给出m个关系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c 所以对于这种情况,按照u ...

  9. 算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 差分约束系统 差分约束系统是一种特殊的N元一次不等式组.它包含N个变量X1,...,XnX_1,...,X_nX1​,...,Xn​ ...

最新文章

  1. php mysql sql mode_Mysql之SQL Mode用法详解_MySQL
  2. [unreal4入门系列之十六] UE4中的集合:TSet容器
  3. selenium 测试
  4. 离群点检测算法——LOF(Local Outlier Factor)
  5. 中国古代天文星象学的入门书:《步天歌》
  6. Springcloud整理
  7. Mybatis源码之缓存模块分析
  8. linux 触摸屏在dev的那个目录下,各硬件设备在Linux中的文件名
  9. 数据库工作笔记004---mysql对结果字段进行判断的函数_Case when等
  10. 数据需求有多野?“三连问”帮你处理得明明白白
  11. 用户画像的构建与使用2应用
  12. pdf怎么转换成ppt
  13. python isupper_Python中用于检查英文字母大写的isupper()方法
  14. 服务器上qq打不开网页,能上qq打不开网页的解决方法
  15. 心智与认知(1): 反馈循环(Feedback loop)
  16. linux设置搜狗输入法,Ubuntu系统安装和使用搜狗输入法
  17. 谷歌服务框架(google services framework)是什么?
  18. 搜狗输入法导入本地txt为个人词库
  19. [经济杂谈]经济危机的真相
  20. 2019年ACM-ICPC关注的一些比赛

热门文章

  1. 无法显示计算机列表,W7系统Internet Explorer无法显示该页面
  2. C/C++:无法打开.obj文件
  3. CRC-CCITT16(0xFFFF、XModem、0x1D0F、Kermit)
  4. Github连接不上怎么办?
  5. websocket连接不上
  6. 我来对比一下阿里云服务器和腾讯云服务器的优劣和区别
  7. 计算机打印机密码怎么设置,电脑设置了密码打印机打不了怎么办
  8. 积木拼图游戏-儿童游戏免费拼图3-6岁
  9. 后台管理使用微信扫码登录(小程序登录)
  10. 怎么给PDF添加页面?推荐三个PDF如何插入页面小妙招