博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 2770_Burn the Linked Camp
阅读量:5060 次
发布时间:2019-06-12

本文共 1591 字,大约阅读时间需要 5 分钟。

题意:

给定每个兵营的最大容量,以及第i到第j个兵营至少有多少个士兵,问所有兵营一共至少有多少个士兵?

分析:

差分约束系统,注意

  • 第i到第j至少有k个
  • 第i到第j最多有最大容量之和个
  • 每个兵营至少有0个
  • 每个兵营最多有最大容量个

代码:

#include
#include
#include
#include
using namespace std;#define mem(s,a) memset(s, a, sizeof(s))typedef long long ll;const int maxm = 25005, maxn = 1005;#define INF 0x3ffffffffstruct edge{
int u,v;ll w;};edge e[maxm];int c[maxn];long long d[maxn];int m, n, tot;bool bellford(){ fill(d,d+n+1,INF); d[n] = 0; for(int i = 0; i < n + 1; i++){ for(int j = 0; j < tot; j++){ int u1= e[j].u, v1 = e[j].v; if(d[u1]!=INF&&d[v1]-d[u1]>e[j].w){ d[v1] = d[u1] + e[j].w; if(i == n) return false; } } } return true;}int main (void){ int t; while(~scanf("%d%d",&n, &m)){ mem(c,0); for(int i = 1; i <= n; i++){ scanf("%d",&t); c[i] = c[i-1] +t; } int i, j, k; tot = 0; for(int a = 0; a < m; a++){ scanf("%d%d%d",&i,&j,&k); e[tot++] = (edge){j, i-1, -k}; e[tot++] = (edge){i-1, j, c[j]-c[i-1]}; } for(int b= 0; b < n; b++){ e[tot++] = (edge){b, b + 1, c[b + 1] - c[b]}; e[tot++] = (edge){b+1, b, 0}; } if(bellford()) printf("%I64d\n",d[n]-d[0]); else printf("Bad Estimations\n"); } return 0;}

之前一直怕k会很大,就用了long long,可是INF忘记改,一直PE,后来改了INF,AC,改成int,AC,可是到现在也不明白为什么是PE而不是WA。

先放着再想想吧。

转载于:https://www.cnblogs.com/Tuesdayzz/p/5758799.html

你可能感兴趣的文章
【题解】[P4178 Tree]
查看>>
Jquery ui widget开发
查看>>
css3实现循环执行动画,且动画每次都有延迟
查看>>
更改git仓库地址
查看>>
有标号DAG计数 [容斥原理 子集反演 组合数学 fft]
查看>>
Recipe 1.4. Reversing a String by Words or Characters
查看>>
Rule 1: Make Fewer HTTP Requests(Chapter 1 of High performance Web Sites)
查看>>
sql注入
查看>>
「破解」Xposed强
查看>>
Linux 平台下 MySQL 5.5 安装 说明 与 示例
查看>>
src与href的区别
查看>>
ABAP工作区,内表,标题行的定义和区别
查看>>
《xxx重大需求征集系统的》可用性和可修改性战术分析
查看>>
Python 中 创建类方法为什么要加self
查看>>
关于indexOf的使用
查看>>
【转】JS生成 UUID的四种方法
查看>>
英语单词
查看>>
centos6.8下安装matlab2009(图片转帖)
查看>>
Mongo自动备份
查看>>
求助大神!怎样批量删除数据库表中某个字段中同样的一段字符!
查看>>