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算法计算d
for(int k=0; k < N; ++k) {
//从i+1到i的权值为0
for(int i=0; i+1 < N; ++i) {
if(d[i+1] < INF) d[i] = min(d[i], d[i+1]);
}
//从AL到BL的权值为DL
for(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的权值为-DD
for(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 Layout (差分约束+SPFA)

    POJ-3169 Layout:http://poj.org/problem?id=3169 参考:https://blog.csdn.net/islittlehappy/article/detail ...

  2. POJ 3169 Layout 差分约束系统

    介绍下差分约束系统:就是多个2未知数不等式形如(a-b<=k)的形式 问你有没有解,或者求两个未知数的最大差或者最小差 转化为最短路(或最长路) 1:求最小差的时候,不等式转化为b-a>= ...

  3. POJ3169:Layout(差分约束)

    http://poj.org/problem?id=3169 题意: 一堆牛在一条直线上按编号站队,在同一位置可以有多头牛并列站在一起,但编号小的牛所占的位置不能超过编号大的牛所占的位置,这里用d[i ...

  4. PKU 3169 Layout(差分约束系统+Bellman Ford)

    题目大意:原题链接 当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些.FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食.奶牛排在队伍中的顺序和它们的编号是相同的 ...

  5. POJ 3169 Layout (差分约束系统)

    Layout 题目链接: Rhttp://acm.hust.edu.cn/vjudge/contest/122685#problem/S Description Like everyone else, ...

  6. 【图论】POJ-3169 差分约束系统

    一.题目 Description Like everyone else, cows like to stand close to their friends when queuing for feed ...

  7. POJ3169差分约束系统

    题意:有n头牛,编号为1到n,对于关系好的ml头牛,al和bl之间的距离不大于dl,关系差的md头牛,ad和bd之间的距离不大于dd,求第1头牛和第n头牛之间的距离 分析:这是一道差分约束系统的题目, ...

  8. 差分约束系统 + spfa(A - Layout POJ - 3169)

    题目链接:https://cn.vjudge.net/contest/276233#problem/A 差分约束系统,假设当前有三个不等式 x- y <=t1 y-z<=t2 x-z< ...

  9. poj3169 差分约束系统

    题意: 从1到n,n个数,从左向右依次排列. 给定两种形式的约束条件: 1.xi与yi的最大距离为dk 2.xi与yi的最小距离为dk 问满足这些限定条件的情况下,数1和n的最大距离是多少?(若约束条 ...

随机推荐

  1. 【HDU3802】【降幂大法+矩阵加速+特征方程】Ipad,IPhone

    Problem Description In ACM_DIY, there is one master called “Lost”. As we know he is a “-2Dai”, which ...

  2. javascript——闭包

    <script type="text/javascript"> //什么是闭包: //是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域 ...

  3. PHP中定义常量的几种方式与区别

    [问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...

  4. 基于php-fpm的配置详解[转载]

    php自带php-fpm/usr/local/php/etc/php-fpm.confpid = run/php-fpm.pidpid设置,默认在安装目录中的var/run/php-fpm.pid,建 ...

  5. 在Adobe Reader中保存PDF表单数据的方法

    通常,Adobe Reader 用户填写表单后,是无法保存所填表单的副本的.但是,对于 Reader 8 和更高版本的用户,您可以扩展其权限,使他们可以完成此操作.如果您使用的是 Acrobat Pr ...

  6. jQuery取CSS的HEX(16位)颜色值

    //IE10以上版本.CHROME.FIREFOX中GRB颜色转HEX颜色值 $.fn.getBackgroundColor = function() { var rgb = $(this).css( ...

  7. Frame Stacking

    poj1128:http://poj.org/problem?id=1128 题意:一个二维图里面有几个相框(四条边的空心矩形框).有重叠,求重叠顺序.还有题目保证至少存在一种符合要求的序列,当有多种 ...

  8. Ferry Loading||

    uva10440:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&am ...

  9. SIM卡基础知识

    一:了解Sim卡和GSM网络登录步骤的基本知识 (一)名词解释: SIM卡(Subscriber Identity Module),即用户识别卡,它是一张符合GSM规范的“智慧卡”,SIM卡有大小之分 ...

  10. struts2令牌,防止重复提交

    struts2的令牌,可以用来防止重复提交,其原理是在提交jsp页面中,写入一个隐藏域name="token",然后在action中定义一个变量token并get.set.在服务器 ...