差分约束关键在于明白为什么可以转化为三角不等式。

还有对于不等式   Xi - Xj <= c,要转化为边<Vj, Vi>。

这ZOJ2770自己分析的还是挺正确的。

具体分析不写了,附个代码= =  加注释可能稍微比较乱。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>using namespace std;#define clr(x) memset(x,0,sizeof(x))
#define fp1 freopen("in.txt","r",stdin)
#define fp2 freopen("out.txt","w",stdout)
#define pb push_back#define INF 0x3c3c3c3c3c
typedef long long  LL;struct Edge {LL from, to, dist;
};const int maxn = 1e6;struct BF{       //结点编号应该从0开始。   应该可以不从0开始
int n;
vector<Edge> edges;
vector<int> G[maxn];
bool inq[maxn];  //队列优化spfa判断是否边已加入
LL d[maxn];
int p[maxn];    //最短路中的上一条弧
int is_neg[maxn];  //进队次数  用于判断是否有负权环void init()
{for(int i = 0;i <= n;i++) G[i].clear();edges.clear();
}void addedge(LL from, LL to, LL dist)  //单向边操作
{//printf("%d %d %d~\n", from, to, dist);edges.push_back((Edge){from, to, dist});int len = edges.size();G[from].push_back(len - 1);
}int spfa(LL be)  //可返回bool判断负权环
{memset(inq, 0, sizeof(inq));memset(p, 0, sizeof(p));memset(is_neg, 0, sizeof(is_neg));  //注释用于判断负环queue<int> Q;for(int i = 0;i <= n;i++)d[i] = INF;d[be] = 0;Q.push(be);inq[be] = true;while(!Q.empty())  //  非空~{int u = Q.front(); Q.pop();inq[u] = false;for(int i = 0;i < G[u].size();i++) {Edge &e = edges[G[u][i]];if(d[e.to] > d[u] + e.dist) {//这地方把想要输入的值已经转化为e.dist了d[e.to] = d[u] + e.dist;p[e.to] = u; //G[u][i]存的是一条边的信息哪不存在标号 直接改成uif(!inq[e.to]) {Q.push(e.to);inq[e.to] = true;if(++is_neg[e.to] > n) return false;}}//else...}}return true;
}
}test;LL sold[1000+10];
LL sum[1000+10];int main()
{//fp1;LL n, m, a, b, c;while(scanf("%lld %lld", &n, &m) == 2){test.n = n;test.init();clr(sold);clr(sum);for(int i = 1;i <= n;i++){scanf("%lld", &sold[i]);sum[i] = sum[i-1] + sold[i];test.addedge(i,i-1,0);       //Si - Si-1 > 0 每个兵营的数目不能小于0test.addedge(i-1,i,sold[i]); //最多容纳sold[i];}//puts("-----------------");for(int i = 1;i <= m;i++){scanf("%lld %lld %lld", &a, &b, &c);test.addedge(b,a-1,-c);             //a---b至少有c个人//test.addedge(a-1,b,sum[b]-sum[a-1]);  //a---b最多有x人}if(!test.spfa(n)){puts("Bad Estimations");//printf("%d\n", test.d[0]);}else printf("%d\n", -test.d[0]);
//
//          test.n = 3;
//          test.addedge(1,2,5);
//          test.addedge(2,3,6);
//          if(!test.spfa(1)) puts("hehe");
//          else printf("%d %d %d\n",test.d[1],test.d[2],test.d[3]);}return 0;
}

ZOJ2770,火烧连营,差分约束相关推荐

  1. zoj 2770 Burn the Linked Camp(火烧连营) 差分约束

    今天学了一个东西叫差分约束,简单来说就是用最短路知识的三角不等式来解多元不等式组.假设 Xv - Xu <= e 可利用最短路的三角不等式将这个不等式转化为图中的一条边,这条单向边是以u为起点, ...

  2. ZOJ 2770火烧连营——差分约束

    偶尔做了一下差分约束. 题目大意:给出n个军营,每个军营最多有ci个士兵,且[ai,bi]之间至少有ki个士兵,问最少有多少士兵. ---------------------------------- ...

  3. zoj2770(差分约束)火烧连营

    差分约束详细解释见电子书 例 4.13 火烧连营(Burn the Linked Camp) 题目来源:ZOJ Monthly, October 2006, ZOJ2770 题目描述: 大家都知道,三 ...

  4. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  5. HDU3440(差分约束+SPFA算法)

    题意:两栋房子之间的最大距离为D,也就是A-B<=D,现在求出最矮和最高房子之间的最大距离 思路:差分约束+SPFA算法: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

  6. HDU1531(差分约束+Bellman_ford)

    题意:给出一个序列Si = {aSi, aSi+1, ..., aSi+ni} 和其子序列S = {a1, a2, ..., an}:在给出序列的约束条件: aSi + aSi+1 + ... + a ...

  7. poj3159(差分约束)

    题意:其实题目要求的就是这个B-A<=c,所以对应单源最短路径中的d[v]>d[u]+e[u][v] 关于差分约束: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

  8. poj1364(差分约束+Bellman-ford)

    题意:给出一个序列Si = {aSi, aSi+1, ..., aSi+ni} 和其子序列S = {a1, a2, ..., an}:在给出序列的约束条件: aSi + aSi+1 + ... + a ...

  9. poj1201(差分约束+SPFA)

    看到这道题,其实就是和poj1716是差不多的 题意:给出n个闭整数区间[ai,bi]和n个整数C1,.,cn.计算具有区间[ai,bi]的至少ci公共元素的整数集Z的最小大小,对于每一个i=1,2, ...

最新文章

  1. ssm框架实现学生成绩管理系统
  2. 有关计算机组装的书,计算机组装实习报告书.doc
  3. 在Django中,“子弹”是什么?
  4. 疾风之刃鸿蒙炸裂,疾风之刃二周年版本12月1日上线_疾风之刃天武僧二觉率先开放_游戏堡...
  5. SAP CRM, C4C和Hybris的后台作业
  6. n个一位数字的数组中选取任意数目的数字,构成的3的最大倍数是多少?
  7. 关于 extern C的说明
  8. windows10上安装mysql
  9. mac 更换brew镜像源
  10. python拆开tuple为多个值传入函数(tuple拆包)
  11. python教程400集笔记,Python学习中的笔记--集合相关,python笔记--集合
  12. 程序员编程知识经验总结
  13. 全新防火墙6.0 单条PPPOE(ADSL)上网配置
  14. mysql 列 随机数_MYSQL中生产随机数或随机字符串
  15. 在Google App Engine中使用hash和marshal持久化模块,快速判断数据库条目是否已经存在...
  16. (转)Mysql 增删用户
  17. github视频教程-02 建立项目仓库以及代码上传
  18. Thinkphp6 baiy/think-async redis 异步代码执行/异步延迟执行/异步事件订阅
  19. LeetCode_回文数(三种解法-Java)
  20. Linux防止stack缓冲区溢出的有效方法

热门文章

  1. Java使用OpenOffice实现在线预览
  2. python版飞机大战源码和素材免费
  3. 区块链最全书单:必读这20本书
  4. MySQL主从复制出现 Slave_IO_Running: No/Connecting
  5. 罚函数与增广Lagrangian乘子法
  6. webots z向履带 x向偏移
  7. python大数据使用教程_python时空大数据
  8. mems加速度计的性能解答-传感器专题
  9. 利用Img构建容器镜像
  10. C618数控车床的主传动系统设计论文、英文翻译、开题报告及全套图纸