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

但是最短路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. Glorious Brilliance (最短路 + 带权二分图匹配)

    这是一道代码大题.一开始读错题意了,然后理解成直接看上去的那种相邻,然后想不通好久!!! 把不同联通的图分离出来,然后先预处理一下形成之后的相邻图的状态,然后根据01确定哪一些是需要更换状态的,然后建 ...

  2. Quick-Cocos2d-x 新建项目

    开发工具准备就绪以后,下面我们就可以开始创建我们的项目了. 首先启动 Quick 下的 player3,在这儿的示例标签下你可以看到很多Quick自带的示例,对于初学者来说,看看这些示例的使用方法会对 ...

  3. kali 开启ssh服务

    1.    一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAuthentication no的注释去掉,并且将NO修 ...

  4. 51Nod 1072 威佐夫游戏

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1072 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆 ...

  5. runltp&ltp-pan

  6. java提供的线程池的使用

    应用场景,比如你有个业务模块,非常耗时,并且还需要重复调用5次. 如果你写个for循环调用5次,调用一次3秒,那么5次就15秒,不是很友好. 这时,如果你用线程池就方便了,多线程跑,都跑完,收集到结果 ...

  7. Python笔记 #20# SOM

    SOM(自组织映射神经网络)是一种可以根据输入对象的特征自动进行分类(聚类)的神经网络.向该网络输入任意维度的向量都会得到一个二维图像, 不同特征的输入会被映射到二维图像的不同地方(所以SOM也可以用 ...

  8. python基础:re模块匹配时贪婪和非贪婪模式

    python贪婪和非贪婪 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符:非贪婪则相反,总是尝试匹配尽可能少 ...

  9. twiested 及其他轮子

    https://www.lfd.uci.edu/~gohlke/pythonlibs/

  10. Prometheus监控学习笔记之360基于Prometheus的在线服务监控实践

    0x00 初衷 最近参与的几个项目,无一例外对监控都有极强的要求,需要对项目中各组件进行详细监控,如服务端API的请求次数.响应时间.到达率.接口错误率.分布式存储中的集群IOPS.节点在线情况.偏移 ...