ZOJ 2770 Burn the Linked Camp 差分约束
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?
problemCode=2770
Burn the Linked Camp
Time Limit: 2 Seconds
Memory Limit: 65536 KB
It is well known that, in the period of The Three Empires, Liu Bei, the emperor of the Shu Empire, was defeated by Lu Xun, a general of the Wu Empire. The defeat was due to Liu Bei's wrong decision that he divided his large troops into a number of camps,
each of which had a group of armies, and located them in a line. This was the so-called "Linked Camps".
Let's go back to that time. Lu Xun had sent many scouts to obtain the information about his enemy. From his scouts, he knew that Liu Bei had divided his troops into n camps, all of which located in a line, labeled by 1..n from left to right. The ith camp
had a maximum capacity of Ci soldiers. Furthermore, by observing the activities Liu Bei's troops had been doing those days, Lu Xun could estimate the least total number of soldiers that were lived in from the ith to the jth camp. Finally, Lu Xun must estimate
at least how many soldiers did Liu Bei had, so that he could decide how many troops he should send to burn Liu Bei's Linked Camps.
Input:
There are multiple test cases! On the first line of each test case, there are two integers n (0<n<=1,000) and m (0<=m<=10,000). On the second line, there are n integers C1��Cn. Then m lines follow, each line has three integers i, j, k (0<i<=j<=n, 0<=k<2^31),
meaning that the total number of soldiers from the ith camp to the jth camp is at least k.
Output:
For each test case, output one integer in a single line: the least number of all soldiers in Liu Bei's army from Lu Xun's observation. However, Lu Xun's estimations given in the input data may be very unprecise. If his estimations cannot be true, output
"Bad Estimations" in a single line instead.
Sample Input:
3 2
1000 2000 1000
1 2 1100
2 3 1300
3 1
100 200 300
2 3 600
Sample Output:
1300
Bad Estimations
和这题一样
http://blog.csdn.net/u013532224/article/details/46897989
就是在相邻点之间建边的时候有点不一样。
题意:
神陆逊 计算 刘备连营的兵力。
给出了刘备n个连营的 最大兵力Ci。
然后 又得到情报 知道 i到j 连营的兵力 至少是k。
然后计算全部人数 最少有多少
做法:(括号内表示该点及其左边全部人数和!!!!!!!!!!)
我们从0点出发。
到1号点,由于连营有最大兵力限制。
所以 (1)-(0)<=C1
又由于 后面的人数前缀和 肯定大于前面的
所以(0)-(1)<=0
然后后面n个点之间都有这样的关系。
(i)-(i-1)<=Ci
(i-1)-(i)<=0
然后依据差分约束。建边。
然后i到j点的兵力不超过k
说明
(j)-(i-1)>=k
(i-1)-(j)<=-k
然后建边。
计算人数和的最小值。
所以就是 计算 (n)-(0)>=?
加个负号
(0)-(n)<=-?
跑个最短路。答案取负即可了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <map> #define VM 6000
#define EM 80005
#define inf 0x7f7f7f7f
int head[VM],ep;
struct edge
{
int v,w,next;
}e[EM]; void addedge(int cu,int cv,int cw)
{
ep ++;
e[ep].v = cv;
e[ep].w = cw;
e[ep].next = head[cu];
head[cu] = ep;
} int spfa (int n,int sta,int ee)
{
int vis[VM],stack[VM],dis[VM],vn[VM];
memset(vis,0,sizeof(vis));
memset(dis,inf,sizeof dis);
//for(int i=1;i<=n;i++)
//dis[i]=-inf;
memset(vn,0,sizeof vn);
vn[sta]=1;
dis[sta] = 0;
vis[sta] = 1;
int top = 1;
stack[0] = sta;
while (top)
{
int u = stack[--top];
if(vn[u]>n)
return -inf;
vis[u] = 0;
for (int i = head[u];i != -1;i = e[i].next)
{
int v = e[i].v;
if (dis[v] > dis[u] + e[i].w)
{
dis[v] = dis[u] + e[i].w;
if (!vis[v])
{
vis[v] = 1;
vn[v]++;
stack[top++] = v;
}
}
}
}
return dis[ee];
}
int main ()
{
int n,m,v1,v2,cost;
int ml,md;
while(scanf("%d%d",&n,&m)!=EOF)
{
ep = 0;
memset (head,-1,sizeof(head)); for(int i=1;i<=n;i++)
{
int tem;
scanf("%d",&tem);
addedge(i,i-1,0);//(i)-(i+1)《=0 后面的点数大
addedge(i-1,i,tem);//(i+1)-(i)《=1 i+1 最多放一个
}
for(int i=0;i<m;i++)
{
int u,v,lim;
scanf("%d%d%d",&u,&v,&lim); //v-u<=lim
addedge(v,u-1,-lim);// v-(u-1)>=lim (u-v)<=lim
} int ans=spfa(n+1,n,0); if(ans==-inf)
puts("Bad Estimations");//负环 有矛盾条件
else if(ans==inf)//无限多
puts("-2");
else
printf("%d\n",-ans);
}
return 0;
}
ZOJ 2770 Burn the Linked Camp 差分约束的更多相关文章
- ZOJ 2770 Burn the Linked Camp 差分约束 ZOJ排名第一~
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1770 题目大意: 陆逊为了火烧连营七百里,派出了间谍刺探敌情,得之刘备的军营以 ...
- zoj 2770 Burn the Linked Camp (差分约束系统)
// 差分约束系统// 火烧连营 // n个点 m条边 每天边约束i到j这些军营的人数 n个兵营都有容量// Si表示前i个军营的总数 那么 1.Si-S(i-1)<=C[i] 这里 建边(i- ...
- ZOJ 2770 Burn the Linked Camp(spfa&&bellman)
//差分约束 >=求最长路径 <=求最短路径 结果都一样//spfa#include<stdio.h> #include<string.h> #include< ...
- zoj2770 Burn the Linked Camp --- 差分约束
有n个营地,每一个营地至多容纳Ci人.给出m个条件:第i到第j个营地之间至少有k人. 问n个营地总共至少有多少人. 此题显然差分约束.要求最小值.则建立x-y>=z方程组,建图求最长路. 用d[ ...
- zoj 2770 Burn the Linked Camp
今天刚刚学差分约束系统.利用最短路求解不等式.世界真的好奇妙!感觉不等式漏下几个会导致WA!! #include<cstdio> #include<cstring> #incl ...
- zoj Burn the Linked Camp (查分约束)
Burn the Linked Camp Time Limit: 2 Seconds Memory Limit: 65536 KB It is well known that, in the ...
- Burn the Linked Camp(bellman 差分约束系统)
Burn the Linked Camp Time Limit: 2 Seconds Memory Limit: 65536 KB It is well known that, in the ...
- ZOJ2770 Burn the Linked Camp(差分约束系统)
区间和一定要联系到前缀和. 这题,把前缀和看作点,从s0到sn: 对于每一个营地i的容量capi,有这么个关系si-si-1<=capi: 对于每一个区间的评估i,j,k,有sj-si-1> ...
- ZOJ 2770 差分约束+SPFA
Burn the Linked Camp Time Limit: 2 Seconds Memory Limit: 65536 KB It is well known that, in the ...
随机推荐
- android6.0 adbd深入分析(二)adb驱动数据的处理、写数据到adb驱动节点
上篇博客最后讲到在output_thread中.读取了adb驱动的数据后.就调用write_packet(t->fd, t->serial, &p)函数,把数据网socket ...
- ubuntu12.10更新源
ubuntu12.10更新源 2013-03-10 20:48:17| 分类: Linux |字号 订阅 不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就 ...
- C++ 4种强制类型转换
C++的四种强制类型转换为:static_cast.const_cast.reinterpret_cast和dynamic_cast 类型转换的一般形式:cast-name(expression); ...
- Oracle SQL Developer 日期格式显示设置
ORACLE的SQL Developer工具默认的日期格式DD-MON-RR,在SQL查询中经常需要查看详细的时间信息,默认的时间显示格式不能满足这一需要, 此时你必须修改日期格式.具体如下所示 工具 ...
- php+mysqli实现批量执行插入、更新及删除数据的方法
本文实例讲述了php+mysqli实现批量执行插入.更新及删除数据的方法.分享给大家供大家参考.具体如下: mysqli批量执行插入/更新/删除数据,函数为 multi_query(). 下面的代码只 ...
- edmx
- ubuntu安装scala详细教程
ubuntu14 安装scala详细教程 1.下载scala压缩包 http://www.scala-lang.org/download/ 2.建立目录,解压文件到所建立目录 $ sudo mkdir ...
- 【微信小游戏】文件系统,远程加载资源打破4M限制
一.前提 微信小游戏,对游戏包体的大小有严格是限制,上传文件大小<4M,但是本地缓存文件有50M空间,也就是说我们可以将一些资源放到网上,然后缓存到本地. 二.官方概念 文件系统 文件系统是小程 ...
- poj 3275(传递闭包)
题目链接:http://poj.org/problem?id=3275 思路:对于n个节点,共有n*(n-1)/2对关系,对于给出的m对已经确定的关系,我们可以用传递闭包推出目前已经确定的关系对数an ...
- js 数组求和,多种方法,并比较性能
可以借用下面12种方法对数组求和,创建一个长度为10w的数组,进行测试 every() 检测数值元素的每个元素是否都符合条件. filter() 检测数值元素,并返回符合条件所有 ...