题意:告诉我们一系列的不等式,当然这些不等式都是两个变量之间的差值,而非和值。刘备拥有N个军营,每个军营都有一个人数的上限,现在陆逊的探子来报刘备的[a, b]军营总人数不低过某一个值,现在问根据这些答案陆逊是否能够正确推断出刘备至少在各营一共驻扎了多少部队,如果不能推出,输出“Bad Estimations”。

分析:根据给定的条件,我们设sum[i]表示刘备前i个军营一共驻扎了多少人,那么每个军营至多有多少人就能够通过不等式列出来。假设一共有三个军营,上限分别为A,B,C,那么有:
0 <= sum[1] - sum[0] <= A
0 <= sum[2] - sum[1] <= B
0 <= sum[3] - sum[2] <= C
而对于陆逊的探子信息,对[a, b]不少于K人转化为:
sum[b] - sum[a] >= K
将sum[x]看做是最短路里面的dis[x]那么根据满足的三角不等式,就能够推出图的边,我们也就能求解出一组合法的满足所有等式的结果。
接下来要求的刘备总共至少驻扎了多少部队,及设要求的量为M,则满足
sum[N] - sum[0] >= M  或  sum[0] - sum[N] <= -M
对于后面的不等式如果设sum[M] = 0,就变成了从N到0的最短路径求解。

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <algorithm>
using namespace std;int N, M, idx, head[1005];
long long sum[1005];
char vis[1005];
int cnt[1005];
long long dis[1005];
struct Edge {int v, next;long long ct;
}e[1050005];void insert(int a, int b, long long ct) {e[idx].v = b, e[idx].ct = ct;e[idx].next = head[a];head[a] = idx++;
}void build() {for (int i = 1; i <= N; ++i) { insert(i-1, i, sum[i] - sum[i-1]);insert(i, i-1, 0);}
}bool spfa() {memset(cnt, 0, sizeof (cnt));memset(vis, 0, sizeof (vis));memset(dis, 0x3f, sizeof (dis));dis[N] = 0, vis[N] = 1;cnt[N] = 1;queue<int>q;q.push(N);while (!q.empty()) {int v = q.front();q.pop();vis[v] = 0;if (cnt[v] > N) return false;for (int i = head[v]; i != -1; i = e[i].next) { if (dis[e[i].v] > dis[v] + e[i].ct) {dis[e[i].v] = dis[v] + e[i].ct;if (!vis[e[i].v]) {q.push(e[i].v);++cnt[e[i].v];vis[e[i].v] = 1;}}}}return true;
}int main() {int a, b, c;while (scanf("%d %d", &N, &M) == 2) {idx = 0;memset(head, 0xff, sizeof (head));for (int i = 1; i <= N; ++i) {scanf("%I64d", &sum[i]);sum[i] += sum[i-1];    // 求一个前缀和
        }for (int i = 0; i < M; ++i) {scanf("%d %d %d", &a, &b, &c);insert(b, a-1, -c);    // 将a, b, c转化为图中的边
        }build();if (spfa()) {printf("%d\n", -dis[0]);} else {puts("Bad Estimations");}}return 0;
}

转载于:https://www.cnblogs.com/Lyush/archive/2013/03/12/2956429.html

ZOJ-2770 Burn the Linked Camp 差分约束相关推荐

  1. ZOJ 2770 Burn the Linked Camp 差分约束+SPFA

    第一道正儿八经的差分约束题 有排成一列的n个点,首先告诉你每个点的值最多是多少(最少显然要大于0),然后告诉你m段i,j,k,表示第i个点到第j个点的值的和至少有k,问你总和至少为多少. 要注意的是, ...

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

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

  3. zoj 2770 Burn the Linked Camp(火烧连营)

    题意:陆逊已知刘备的每个大营最多能容纳Ci个士兵,并且可以估计到第i个大营到第j个大营至少有多少士兵,求刘备最少有多少个士兵. 分析:根据给出的数据我们可以得到一系列不等式组,考虑采用差分约束系统求解 ...

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

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

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

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

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

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

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

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

  8. HDU1531(差分约束+Bellman_ford)

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

  9. poj3159(差分约束)

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

最新文章

  1. lvm讲解和磁盘故障案例
  2. python的高级函数_Python的高级函数
  3. 36. Valid Sudoku
  4. CodeForces - 796D Police Stations bfs
  5. 给 python 初学者的四条忠告_给 python 初学者的四条忠告-Go语言中文社区
  6. WordPress网站弹窗插件PopupPress插件
  7. 查看一张表都有哪些用户有权限_有赞移动关于权限与审批流程的标准化
  8. 乐视视频回应APP标注“欠122亿”:欠款大家都知道 不影响观看视频
  9. java.lang.OutOfMemoryError: Java heap space异常
  10. fullCalendar:中文API
  11. 少样本学习系列(三)【Optimization-Based Methods】
  12. 如何用B表的数据,更新A表的值
  13. [canvas基础]pcmobile写字板
  14. Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(
  15. matlab灰度分段线性变换优缺点,matlab分段线性变换
  16. php字体颜色代码大全,CSS中关于文本字体颜色(CSS color)的详解
  17. 一张图说明白数据安全管理体系的规划
  18. 速腾聚创16线雷达离线和实时跑Lego-loam
  19. 基于R语言结构方程模型
  20. 笔记本电脑开机指示灯亮但显示屏没有反应(已解决)

热门文章

  1. centos7怎么重置mysql密码_centOS7.4 重置mysql 密码
  2. 阿伏法机器人_知识与技能 (1)知道机器人的相关知识. (2)理解模块机器人的构成以及各个模块的作用. (3)知道模块电路及其组合方式. (4)初步学会组装和操作模块机器人....
  3. vue 中provide的用法_聊聊Vue中provide/inject的应用详解
  4. m5310模组数据上传至onenet_5G通信模组799元限量发售,中国移动意欲何为?
  5. ansible(6)——模块命令command、shell详细用法
  6. MFC改变static text颜色
  7. java.lang.IllegalStateException: Error starting child错误的产生与解决
  8. 《Linux内核设计与实现》读书笔记(二十)- 补丁, 开发和社区
  9. javascript number转string不用科学计数法_[JavaScript]之数据类型篇
  10. C++直接初始化与复制初始化的区别深入解析