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

本文共 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/5758798.html

你可能感兴趣的文章
javascript中sort()排序方法总结
查看>>
实现聊天界面的代码
查看>>
自己生成一个NDK的浅析
查看>>
Excel数据导入到数据库
查看>>
jQuery最佳实践
查看>>
SELinux FAQ
查看>>
Java中synchronized同步的理解
查看>>
python 数值计算库
查看>>
java 服务重启 js 中被注释代码仍然执行
查看>>
我并不是不闻不问![C#]
查看>>
web前端经典小题
查看>>
AutoCAD如何倒角 倒圆角 倒直角
查看>>
Office PPT中如何插入flash
查看>>
C# Fade Form Effect With the AnimateWindow API Function
查看>>
golang多维数组的切片
查看>>
IP 网际协议
查看>>
C语言_第五章__实践(密码转换)
查看>>
docker 容器后台运行命令
查看>>
jquery 获取css position的值
查看>>
面向对象的程序设计
查看>>