一道看一眼就知道差分约束的题目

但是最短路spfa的时候注意松弛条件是

if(dis[u]+w[i]<dis[v[i]])
dis[v[i]]=dis[u]+w[i];

不能写成

if(dis[u]+w[i]<=dis[v[i]])
dis[v[i]]=dis[u]+w[i]

否则会TLE


就是如何把\( a_{i}-a_{j} \ge t \),方法非常简单,只需要乘上-1 就可以愉快地变成\( a_{j}-a_{i} \le -t \)了

然后就是建立图。

瞪眼法可知我们可以使用类似前缀和的结构来维护一个到第i个位置一共种了多少颗树的信息

然后我们设\( d_{i} \) 表示到第i个位置现在有多少颗树

题目中要求的条件

BE中间种的树的数量不少于T

就可以转化为 \( d_{e}-d_{b-1} \ge t \)了,然后用到刚才的转化方法

把式子化成 \( d_{b-1}-d_{e} \le -t \)了

所以我们可以从e向b-1连一条边权为-t的边

建完了这些边之后,我们会发现一个问题,这个图没办法直接跑最短路解出解废话因为这个图根本不联通啊

所以我们要来思考一下还有什么其他的约束条件

首先显而易见的有

\( d_{n+1}-d_{i} \le 0 \ ,0 \le i \ge n \) 即 \( d_{i}-d_{n+1} \ge 0 \ ,0 \le i \le n \) ,所以我们可以从n+1的节点连一条边权为0的边到第i个节点

其次还有几个显而易见的结论

\(d_{i}-d_{i-1} \ge 1 \)

\(d_{i-1} - d_{i} \ge 0\)

同样的从i-1向i连一条边权为1的边,再从i向i-1连一条边权为0的边

大功告成!

然后我们想想好像也没啥其他条件了

跑一边spfa最短路

然后差分做出来的是相对的大小qwq

所以如果最后的dis[n]能减去一个mindis的话,解会更优且不会违背条件

然后贴代码

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = ;
const int MAXM = ;
int cnt=,u[MAXM],v[MAXM],w[MAXM],first[MAXN],next[MAXM];
bool vis[MAXN];
int inq[MAXN],dis[MAXN];
int n,h;
void addedge(int ux,int vx,int wx){
++cnt;
u[cnt]=ux;
v[cnt]=vx;
w[cnt]=wx;
next[cnt]=first[ux];
first[ux]=cnt;
}
int spfa(int s,int t){
queue<int> q;
for(int i=;i<=n+;i++){
dis[i]=0x3f3f3f3f;
}
q.push(s);
dis[s]=;
inq[s]=;
vis[s]=;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=;
for(int i=first[u];i;i=next[i]){
if(w[i]+dis[u]<dis[v[i]]){
dis[v[i]]=w[i]+dis[u];
if(!vis[v[i]]){
vis[v[i]]=;
inq[v[i]]++;
q.push(v[i]);
if(inq[v[i]]>n)
return 0x3f3f3f3f;
}
}
}
}
}
int main(){
scanf("%d %d",&n,&h);
int b,e,t;
for(int i=;i<=h;i++){
scanf("%d %d %d",&b,&e,&t);
addedge(e,b-,-t);
}
addedge(n+,,);
for(int i=;i<=n;i++){
addedge(n+,i,);
addedge(i,i-,);
addedge(i-,i,);
}
spfa(n+,);
int mind=0x3f3f3f3f;
for(int i=;i<=n;i++){
mind=min(mind,dis[i]);
}
printf("%d",dis[n]-mind);
return ;
}

题解——洛谷P1250 种树(差分约束)的更多相关文章

  1. 种树-洛谷P1250(差分约束)

    传送门 令前缀和为s[i],则⼀一个要求等价于 s[r] - s[l - 1] >= x. 题中还有别的要求,包括 s[i] - s[i - 1] <= 1 和 s[i] - s[i- 1 ...

  2. 洛谷P1250种树(贪心)

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...

  3. HDU 1384 Intervals &洛谷[P1250]种树

    差分约束 差分约束的裸题,关键在于如何建图 我们可以把题目中给出的区间端点作为图上的点,此处应注意,由于区间中被标记的点的个数满足区间加法,这里与前缀和类似,对于区间[L..R]来说,我们加入一条从L ...

  4. Java实现洛谷P1250 种树 (暴力)

    P1250 种树 输入输出样例 输入 9 4 1 4 2 4 6 2 8 9 2 3 5 2 输出 5 PS: 我种最少的树,意味着我的树要最多的被利用,意味着,我的树要尽可能的靠中间种, 也就是我把 ...

  5. 洛谷 P1250 种树 题解

    差分约束系统,维护前缀和,根据式子d[ b ] < = d[ e + 1 ] - t,可以看出要连e和b - 1,但占用了超级源点0,所以要把区间向后移,这样就可以用超级源点0来保持图的连通性( ...

  6. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  7. 【最短路·差分约束】洛谷P1250

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...

  8. 题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)

    裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...

  9. 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)

    看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...

随机推荐

  1. uvalive 3887 Slim Span

    题意: 一棵生成树的苗条度被定义为最长边与最小边的差. 给出一个图,求其中生成树的最小苗条度. 思路: 最开始想用二分,始终想不到二分终止的条件,所以尝试暴力枚举最小边的长度,然后就AC了. 粗略估计 ...

  2. 【Elasticsearch学习之三】Elasticsearch 搜索引擎案例

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 elasticsearch-2.2.0 第一步:获取数据主流 ...

  3. 大数据处理框架之Strom:redis storm 整合

    storm 引入redis ,主要是使用redis缓存库暂存storm的计算结果,然后redis供其他应用调用取出数据. 新建maven工程 pom.xml <project xmlns=&qu ...

  4. Mini-Batch 、Momentum、Adam算法的实现

    Mini-Batch 1. 把训练集打乱,但是X和Y依旧是一一对应的 import numpy as np a = np.random.randn(3,3) print(a) b = list(np. ...

  5. Sqoop 学习之路

    sqoop 基础知识和基本操作可以参考这篇博客:https://www.cnblogs.com/qingyunzong/p/8807252.html#_label3

  6. nextjs 服务端渲染请求参数

    Post.getInitialProps = async function (context) { const { id } = context.query const res = await fet ...

  7. Android开源图表图形库K线图

    Android开源图表图形库K线图 web端k线图一般使用TradingView,android原生的一般是在MPAndroidChart 基础上做开发的,目前看到一个比较好的K线开源组件是KChar ...

  8. Linux 配置 JDK

    1. 上传 JDK 2. 解压文件 tar -xvf 文件名 3. 配置环境变量: 指令 vim /etc/profile 以上格式是不变的,使用时只改变 JAVA_HOME 和 JAVA_BIN 的 ...

  9. Deeplearning 两层cnn卷积网络详解

    https://blog.csdn.net/u013203733/article/details/79074452 转载地址: https://www.cnblogs.com/sunshineatno ...

  10. USB开发库STSW-STM32121文件分析(转)

    源: USB开发库STSW-STM32121文件分析