题意:

  • 从1到n,n个数,从左向右依次排列。

    给定两种形式的约束条件:

    1.xi与yi的最大距离为dk

    2.xi与yi的最小距离为dk

    问满足这些限定条件的情况下,数1和n的最大距离是多少?(若约束条件相互矛盾则输出-1,若最大距离能够为无穷大则输出-2)

    知识补充:

    • 差分约束系统的概念:由n个变量和m个约束条件(实数)组成。且都是形如:
      xi−yj≤bk(x,y为变量,b为实数)

      的形式。

    • 用Bellman-Ford算法求解差分约束系统:因为最短路三角不等式:d[v]−d[u]≤e[u,v]与差分约束的不等式形式一样,故构建j到i长度为bk的边来建成一个图,因为可能存在负边所以用Bellman-Ford算法来求解最短路,终于得到的d[i]数组是满足该差分约束系统的一个可行解。
    • 注:若{d[1], d[2], ….. ,d[n]}是差分约束系统的一个可行解,那么{d[1] + x, d[2] + x, ….., d[n] + x}也是可行解。
    • 关于d[n]数组的初始化:假设将原点s到每一个顶点的距离都设置为0,最后求出来的可行解满足这些点相互之间距离最小。假设将当中一个点设为起点。其他点的距离都设置设为INF,那么终于求出来的可行解,满足该起点,到其他每一个点相互之间的距离最大。

    思路:

  • 题目为有三个限制条件的差分约束系统,即:

    d[i]−d[i+1]≤0
    d[BL]−d[AL]≤DL
    d[AD]−d[BD]≤DD

    依据这三个不等式建立图,这里核心难点是:为什么d[n] - d[1](即起点1到终点n的最短距离)就是对于约束条件下,1到n的最长距离?(这里尚未思考明确…..)

代码(代码中的Bellman-Ford算法经过防止负圈优化):

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
const int INF = 0x3fffffff;
struct edge{int from, to, cost;}E[100009];
int v, n, m, size; void input(void) {
int x, y, z;
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &x, &y, &z);
E[size++] = (edge){x - 1, y - 1, z};
}
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &x, &y, &z);
E[size++] = (edge){y - 1, x - 1, -z};
}
} int bellman_ford(void) {
int d[v];
fill(d, d + v, INF);
d[0] = 0;
for (int k = 0; k < v; k++) { //因为可能存在负圈会无限更新的情况要注意设置更新次数上限为顶点个数。
bool update = false;
for (int i = 0; i < size; i++) {
if(d[E[i].to] > d[E[i].from] + E[i].cost && d[E[i].from] < INF) {
update = true;
d[E[i].to] = d[E[i].from] + E[i].cost;
}
}
if(!update) break;
}
if(d[0] < 0) return -1;
if(d[v - 1] == INF) return -2;
return d[v - 1];
} int main(void)
{
while (~scanf("%d%d%d", &v, &n, &m)) {
size = 0;
for (int i = 0; i < v - 1; i++) {
E[size++] = (edge){i + 1, i, 0}; //这个形式非常有趣
}
input();
printf("%d\n", bellman_ford());
}
return 0;
}

poj3169 差分约束系统的更多相关文章

  1. POJ3169差分约束系统

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

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

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

  3. UVA11478 Halum [差分约束系统]

    https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的 ...

  4. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

  5. ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)

    当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方 ...

  6. POJ1201 Intervals(差分约束系统)

    与ZOJ2770一个建模方式,前缀和当作点. 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次. 后来偷看数据才想到这题还有两个隐藏的约束条件. 这题前缀和 ...

  7. UVA 11374 Halum (差分约束系统,最短路)

    题意:给定一个带权有向图,每次你可以选择一个结点v 和整数d ,把所有以v为终点的边权值减少d,把所有以v为起点的边权值增加d,最后要让所有的边权值为正,且尽量大.若无解,输出结果.若可无限大,输出结 ...

  8. Burn the Linked Camp(bellman 差分约束系统)

    Burn the Linked Camp Time Limit: 2 Seconds      Memory Limit: 65536 KB It is well known that, in the ...

  9. zoj 2770 Burn the Linked Camp (差分约束系统)

    // 差分约束系统// 火烧连营 // n个点 m条边 每天边约束i到j这些军营的人数 n个兵营都有容量// Si表示前i个军营的总数 那么 1.Si-S(i-1)<=C[i] 这里 建边(i- ...

随机推荐

  1. 创建私有CA, 加密解密基础, PKI, SSL

    发现了一篇图文并茂的超棒的  加密解密, CA, PKI, SSL 的基础文章, 链接如下:https://blog.csdn.net/lifetragedy/article/details/5223 ...

  2. 状压DP复习

    深感自己姿势水平之蒻……一直都不是很会状压DP,NOIP又特别喜欢考,就来复习一发…… 题目来源 Orz sqzmz T1 [BZOJ4197][NOI2015]寿司晚宴 (做过)质因数分解最大的质因 ...

  3. NOIp2018模拟赛三十五

    两道大数据结构把我砸懵 成绩:未提交 Orz xfz两道正解 A:[BZOJ4049][CREC2014B]mountainous landscape B:CJB的大作(CF改编题)

  4. Spring Boot基础教程》 第1节工具的安装和使用

    <Spring Boot基础教程> 第1节 工具的安装和使用 Spring Boot文档 https://qbgbook.gitbooks.io/spring-boot-reference ...

  5. 30 个实例详解 ,让运维彻底搞清TOP 命令!

    Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被广泛用于监视服务器的负载.在本篇中,我们会探索top命令的细节.top命令是一个交互命令.在运行top的时候还可以运 ...

  6. unity Android在streamingAssets路径下文件无法读取的的解决方法

    unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...

  7. C#之改变窗体icon图标、新建类文件、调用dll库

    一.改变窗体的图标 没有修改之前为: 修改之后为自己想要的图标: 需要在窗体Form1.cs属性里边添加icon图片文件: 二.新建cs类文件 如下图所示,新建一个类文件,我用于来调用库文件也可以来定 ...

  8. 【转】C#添加修改删除文件文件夹大全

    [转]C#添加修改删除文件文件夹大全 C#添加修改删除文件文件夹大全 StreamWriter sw = File.AppendText(Server.MapPath(".")+& ...

  9. code vs 1216 跳马问题

    1216 跳马问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 题目 输入描述 Input Descri ...

  10. 【LeetCode OJ 34】Search for a Range

    题目链接:https://leetcode.com/problems/search-for-a-range/ 题目:Given a sorted array of integers, find the ...