博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EOJ 3263 丽娃河的狼人传说
阅读量:5878 次
发布时间:2019-06-19

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

差分约束系统,$spfa$。

首先判断无解,若某个约束的$t$大于区间长度,则一定无解。

否则一定有解,可以得到一系列的不等式:

最终区间和大于等于目前的区间和:$S[R]-S[L-1]≥val$,

每一个位置的值小于等于$1$:$S[R]-S[R-1]≤1$,

每一个约束条件:$S[R]-S[L-1]≥t$,

最终是要求$S[n]-S[0]$最小是多少,扔进差分约束系统,跑$S[0]$到$S[n]$的最长路即可。

#include 
#include
#include
#include
#include
#include
#include
using namespace std;int T;int n,m,k;int dis[2000],f[2000];int h[2200000];int to[2200000];int val[2200000];int nx[2200000];int sz;int a[2000];int cas=1;void add(int a,int b,int c){ to[sz] = b; val[sz] = c; nx[sz] = h[a]; h[a] = sz++;}void spfa(){ for(int i=0;i<=n;i++) dis[i] = -n-1, f[i] = 0; queue
Q; Q.push(0); f[0] = 1; dis[0] =0; while(!Q.empty()) { int x =Q.front(); Q.pop(); f[x]=0; for(int i=h[x];i!=-1;i = nx[i]) { int y = to[i], cost = val[i]; if(dis[x] + cost > dis[y]) { dis[y] = dis[x] + cost; if(f[y]==0) { f[y] = 1; Q.push(y); } } } }}int main(){ scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); for(int i=0;i<=n;i++) h[i]=-1, a[i] = 0; sz=0; for(int i=1;i<=k;i++) { int x; scanf("%d",&x); a[x]=1; } for(int i=1;i<=n;i++) { a[i] = a[i]+a[i-1]; add(i,i-1,-1); } bool fail=0; for(int i=1;i<=m;i++) { int L,R,t; scanf("%d%d%d",&L,&R,&t); add(L-1,R,t); if(R-L+1

转载于:https://www.cnblogs.com/zufezzt/p/6848243.html

你可能感兴趣的文章
好作品地址
查看>>
[翻译]Protocol Buffer 基础: C++
查看>>
runloop与线程的关系
查看>>
[Bzoj2246]迷宫探险(概率+DP)
查看>>
[译] 感受 4px 基线网格带来的便利
查看>>
oracle常用函数
查看>>
MYBATIS
查看>>
详解消息队列的设计与使用
查看>>
iOS 项目优化
查看>>
筛选出sql 查询结果中 不包含某个字符
查看>>
8进制与16进制
查看>>
使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误
查看>>
mybatis:Invalid bound statement (not found)
查看>>
电脑中毒的现象
查看>>
django表单操作之django.forms
查看>>
webSocket vnc rfb
查看>>
列表推导式 生成器表达式
查看>>
控制子窗口的高度
查看>>
Linux 防火墙iptables命令详解
查看>>
打造笔记本电脑基地重庆要当全球“老大”
查看>>