zoj 2770 Burn the Linked Camp(火烧连营)
题意:陆逊已知刘备的每个大营最多能容纳Ci个士兵,并且可以估计到第i个大营到第j个大营至少有多少士兵,求刘备最少有多少个士兵。
分析:根据给出的数据我们可以得到一系列不等式组,考虑采用差分约束系统求解。以第一组测试数据解释差分约束系统及构造求解。
设三个军营的人数分别为A1,A2,A3,容量为C1,C2,C3,前n个军营的总人数为Sn,则可以列出以下不等式组。
⑴第i个大营到第j个大营士兵总数至少有k个。
S2 - S0 >= 1100 ---> S0 - S2 <= -1100
S3 - S1 >= 1300 ---> S1 - S3 <= -1300
⑵第i个大营到第j个大营不超过这些兵营容量只和,设d[i]为前i个大营容量总和。
S2 - S0 <= d[2] - d[0] = 3000
S3 - S1 <= d[3] - d[1] = 3000
⑶每个兵营实际人数不超过容量。
A1 <= 1000 ---> S1 - S0 <= 1000
A2 <= 2000 ---> S2 - S1 <= 2000
A3 <= 1000 ---> S3 - S2 <= 1000
⑷Ai>=0
S0 - S1 <= 0
S1 - S2 <= 0
S2 - S3 <= 0
把以上不等式组整理好后,我们就可以构造出一个有向图,构造好图后,我们要求的是 S3 - S0的最小值,即 S3 - S0 >= M ---> S0 - S3 <= -M,求S3到S0的最短路径,长度为-M,最终结果就是M。若无最短路径则输出Bad Estimations。
以上参考自:《图论算法理论、实现及应用》---北京大学出版社
第一道差分约束的题,做完还不是很明白 - -。
代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>using namespace std;const long long inf = 10000000000000LL;
const int maxn = 10005;struct node{int v;long long w;node(int _v, long long _w){v = _v; w = _w; }
};int n,m;
int c[maxn]; //每个兵营的人数限制
long long d[maxn]; //前i个兵营的人数总和
vector<node> list[maxn];
long long dist[maxn];//for spfa
int cnt[maxn]; //判断负环
bool inq[maxn];bool input(){if(scanf("%d%d",&n,&m) == EOF) return false;for(int i = 1; i <= n; i++) scanf("%d",&c[i]);//求和 d[0] = 0;for(int i = 1; i <= n; i++) d[i] = d[i-1] + c[i];//clearfor(int i = 0; i <= n; i++) list[i].clear();int u,v,w;for(int i = 0; i< m; i++){scanf("%d%d%d",&u,&v,&w);//情形1 list[v].push_back(node(u-1,-w));//情形2list[u-1].push_back(node(v,d[v]-d[u-1]));}for(int i = 1; i <= n; i++){//情形3list[i-1].push_back(node(i,c[i]));//情形4list[i].push_back(node(i-1,0));}return true;
}bool spfa(int s){queue<int> q;for(int i = 0; i <= n; i++){dist[i] = inf;inq[i] = false;cnt[i] = 0;}dist[s] = 0;q.push(s);cnt[s]++;while(!q.empty()){int u = q.front(); q.pop(); inq[u] = false;if(cnt[u] >= n) return false;for(int i = 0; i < list[u].size(); i++){int v = list[u][i].v;long long w = list[u][i].w;if(dist[u] + w < dist[v]){dist[v] = dist[u] + w;if(!inq[v]){q.push(v); inq[v] = true; cnt[v]++;}}}}return true;
}void solve(){if(spfa(n)){printf("%lld\n",-dist[0]);}else{printf("Bad Estimations\n");}
}int main(){while(input()){solve();}return 0;
}
zoj 2770 Burn the Linked Camp(火烧连营)相关推荐
- zoj 2770 Burn the Linked Camp(火烧连营) 差分约束
今天学了一个东西叫差分约束,简单来说就是用最短路知识的三角不等式来解多元不等式组.假设 Xv - Xu <= e 可利用最短路的三角不等式将这个不等式转化为图中的一条边,这条单向边是以u为起点, ...
- ZOJ 2770 Burn the Linked Camp 差分约束+SPFA
第一道正儿八经的差分约束题 有排成一列的n个点,首先告诉你每个点的值最多是多少(最少显然要大于0),然后告诉你m段i,j,k,表示第i个点到第j个点的值的和至少有k,问你总和至少为多少. 要注意的是, ...
- ZOJ-2770 Burn the Linked Camp 差分约束
题意:告诉我们一系列的不等式,当然这些不等式都是两个变量之间的差值,而非和值.刘备拥有N个军营,每个军营都有一个人数的上限,现在陆逊的探子来报刘备的[a, b]军营总人数不低过某一个值,现在问根据这些 ...
- zoj2770(差分约束)火烧连营
差分约束详细解释见电子书 例 4.13 火烧连营(Burn the Linked Camp) 题目来源:ZOJ Monthly, October 2006, ZOJ2770 题目描述: 大家都知道,三 ...
- YYHS-吴传之火烧连营(梦回三国系列T3)(trie树)
题目描述 [题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势.蜀军远征,补给困难,又不能速战速决,加上入夏以后天气炎热,以致 ...
- trie树——【吴传之火烧连营】
突然发现好像没有讲过一种叫做tire树的神奇东西. 问题描述: 题目描述 [题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势 ...
- 2016暑期集训10 C吴传之火烧连营
吴传之火烧连营 时间限制: 1 Sec 内存限制: 128 MB 题目描述 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势.蜀军远征, ...
- Jzoj3908 吴传之火烧连营 (梦回三国系列)
[题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势.蜀军远征,补给困难,又不能速战速决,加上入夏以后天气炎热,以致锐气渐失, ...
- JZOJ 3908 吴传之火烧连营
题目大意 题目大意就是对于一个序列,多次询问求在 xor K 的情况下最大值. 原题 Description [题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆 ...
最新文章
- Wireshark实验HTTP
- Java基础篇:常用类
- 原创 | IJCAI 2020灭霸式拒稿,AI审稿是否更公平?
- IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (中篇)-js-ipfs-api - 图片上传到IPFS以及下载
- sde表空间无法导入数据和编辑
- 10条建议让你创建更好的jQuery插件(转载)
- python入门环境准备_python入门 之 环境配置(一)
- UBLOX配置/GPS配置设置/u-center使用
- mysql 全文索引 使用_MySql全文索引
- 保姆级教程,如何发现 GitHub 上的优质项目?
- Python系列 - pip管理工具
- 武汉理工大学计算机考研考纲,2018年武汉理工大学825流体力学考试大纲
- Kryo的基本简单使用
- html制作不均匀表格,HTML自定义JUnit报告不均匀表格对齐
- 计算机组装与维修王利民版,计算机组装与维修(第5版)
- kindeditor 上传图片返回带 当前网址的图片地址
- P1719 最大加权矩形
- 先学python还是ros_如何学习Ros?
- 【渝粤教育】国家开放大学2018年秋季 0359-21T会计学原理 参考试题
- 分词计算频次代码-GO