poj3169 差分约束系统
题意:
从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,那么终于求出来的可行解,满足该起点,到其他每一个点相互之间的距离最大。
思路:
- 差分约束系统的概念:由n个变量和m个约束条件(实数)组成。且都是形如:
题目为有三个限制条件的差分约束系统,即:
d[i]−d[i+1]≤0d[BL]−d[AL]≤DLd[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 差分约束系统的更多相关文章
- POJ3169差分约束系统
题意:有n头牛,编号为1到n,对于关系好的ml头牛,al和bl之间的距离不大于dl,关系差的md头牛,ad和bd之间的距离不大于dd,求第1头牛和第n头牛之间的距离 分析:这是一道差分约束系统的题目, ...
- 【图论】POJ-3169 差分约束系统
一.题目 Description Like everyone else, cows like to stand close to their friends when queuing for feed ...
- UVA11478 Halum [差分约束系统]
https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的 ...
- BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5395 Solved: 1750[Submit][Status ...
- ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)
当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方 ...
- POJ1201 Intervals(差分约束系统)
与ZOJ2770一个建模方式,前缀和当作点. 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次. 后来偷看数据才想到这题还有两个隐藏的约束条件. 这题前缀和 ...
- UVA 11374 Halum (差分约束系统,最短路)
题意:给定一个带权有向图,每次你可以选择一个结点v 和整数d ,把所有以v为终点的边权值减少d,把所有以v为起点的边权值增加d,最后要让所有的边权值为正,且尽量大.若无解,输出结果.若可无限大,输出结 ...
- Burn the Linked Camp(bellman 差分约束系统)
Burn the Linked Camp Time Limit: 2 Seconds Memory Limit: 65536 KB It is well known that, in the ...
- zoj 2770 Burn the Linked Camp (差分约束系统)
// 差分约束系统// 火烧连营 // n个点 m条边 每天边约束i到j这些军营的人数 n个兵营都有容量// Si表示前i个军营的总数 那么 1.Si-S(i-1)<=C[i] 这里 建边(i- ...
随机推荐
- nodejs 守护进程运行
有四种方法: 1.forever forver start bin/www 2.pm2 pm2 strat bin/www 3.node自身进程保护 nohup node /bin/www > ...
- Java基础学习总结(7)——Object类
一.Object类介绍 Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能 ...
- solr环境搭建&基本使用
分步指南 solr服务与tomcat整合 solr使用配置步骤 solr使用 推荐分词工具 相关的文章 一.Solr服务与tomcat整合 1.solr相关版本下载路径:http://archive. ...
- POJ 3207 Ikki's Story IV - Panda's Trick(2-sat)
POJ 3207 Ikki's Story IV - Panda's Trick id=3207" target="_blank" style=""& ...
- 【金阳光測试】基于控件核心技术探讨---Android自己主动化系列(2)---2013年5月
第一讲分享了下安卓自己主动化一些概况和一些自己主动化框架现状和技术可以解决什么样的问题. 这次课就深入到android世界里面.遨游.翱翔.深入了解自己主动化測试核心技术. 搞过编程开发的同学听到in ...
- PhpStorm Live Template加PHP短语法Short Open Tags打造原生模板
关于Php要不要使用模板一直被大家讨论,支持的说使用模板更简洁,易与前端project师交流.反对的说Php本身就支持内嵌语法,不是必需再用个模板,减少性能. 事实上使用Php的短语法.直接嵌入也不是 ...
- js 使用(不断更新...)
1.JS 对象(Object)和字符串(String)互转 var jsObj = {}; jsObj.testArray = [1, 2, 3, 4, 5]; jsObj.name = 'CSS3' ...
- 智课雅思词汇---十一、spect是什么意思
智课雅思词汇---十一.spect是什么意思 一.总结 一句话总结:词根:spect, speci, spec(spic, spi, spy) = to look, to see 看 1.port是什 ...
- PermissionError: [Errno 13] in python
出现该错误,首先尝试以管理员身份运行 cmd.exe 程序,然后关闭所有的与 python 相关的进程. 1. open 打开一个文件夹(目录),而不是文件 这一错误一般发生在使用 open函数对文件 ...
- Mysql常见更改密码方法
ERROR (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) ch ...