Luogu P1993 题解
p1993 小康的农场
CSP_S 1=之后就没怎么写题解。。
推荐博客食用
预备知识
明显这是一道差分约束的题,以下简称差分
有些人可能不了解差分,请点 [传送门]
至于用差分做的题的特征,无一都是你可以列出每个变量之间的一些不等关系,就如下
x_1-x_2 \le a_1 \\
x_2-x_3 \le a_2 \\
x_3-x_4 \le a_3 \\
\ldots \ldots \\
x_n-x_n \le a_{n-1} \\
\end{cases}
\]
对于这样的题我们把他转化为一个图来解决
具体实现是:
- 对于一个不等关系,把它转化为形如\(x-y \le c\)的式子
- 由\(y\)向\(x\)连一条权为c的边
- 若是‘=’ 号,转化为\(x-y \le c\)和\(y-x \le c\),来处理
- 构建一个\(0\)节点,对每个节点的边权都为\(0\),防止图不连通,而且这样不会影响最短路
- 跑一次最短路,因为有负权用spfa
大体的步骤,就是这些了
重点
但是,这道题显得奇奇怪怪,为啥呢,用朴素的SPFA跑出TLE了,看题解都是用的dfs优化,可我偏不,事实上是不想删代码,我加了容错SLF和mcfx,就轻松过掉了,时间优化巨大
SPFA死了吗,没有,因为就连p4779,也没有卡住我
值得一提的是,你的容错值定义的要靠近零一点,在\(-3\)到\(0\),之间为能过掉,因为这个题有负权,如果全是正权的话在\(0\)到\(4\) ,比较合适
还有一点就是,必须要有mcfx,区间的跨度在1000左右为适宜,为\(200\)至\(1000\),最好,单独的优化价值都不大,可是加在一起,就是巨大的飞跃
事实上,是因为我不会dfs的spfa,蒟蒻的无力。。。
哈哈
AC代码
有详细注释
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int Maxn=1e4+11;
struct Node {
int to,lac,wg;
}edge[Maxn*3];
int n,m,t,a,b,c,h[Maxn],cnt,dis[Maxn],tot[Maxn];
bool vis[Maxn];
void insert(int x,int y,int c){//邻接表存边
edge[cnt].lac=h[x];
edge[cnt].to=y;
edge[cnt].wg=c;
h[x]=cnt++;//我的边编号为从0开始,为了
//找对应边方便 ^1,即可
}
int val=-1,l=102,r=1138;//玄学取值
bool spfa(){
memset(dis,63,sizeof dis);//刚开始给个最大值
dis[0]=0;vis[0]=1;tot[0]=1;
deque<int> q;
q.push_front(0);//0入队
while(!q.empty()){
int fr=*(q.begin());
q.pop_front();
vis[fr]=0;
for(int i=h[fr];i!=-1;i=edge[i].lac){
int to=edge[i].to;
if(dis[to]>dis[fr]+edge[i].wg){//能更新则更新
dis[to]=dis[fr]+edge[i].wg;
if(!vis[to]){//不在队里考虑将他入队
vis[to]=1;
if(tot[to]>=l&&tot[to]<=r) q.push_front(to);//mcfx优化
else if(q.size()==0) q.push_back(to);//队里没有东西,直接进队
else if(dis[to]>dis[*(q.begin())]+val) q.push_back(to);//容错SLF优化
else q.push_front(to);
tot[to]++;//别忘记录入队次数
if(tot[to]==n) return false;//每个节点入队达到n次就无解
}
}
}
}
return true;
}
int main() {
// freopen("kk.in","r",stdin);//文件操作,因为我这种蒟蒻经常错
scanf("%d%d",&n,&m);
memset(h,-1,sizeof h);//初始化head,不能忘!
for(int i=1;i<=n;i++){
scanf("%d%d%d",&t,&a,&b);
if(t==3){
insert(a,b,0);
insert(b,a,0);//对于等于的情况特殊处理
continue;
}
scanf("%d",&c);
if(t==1) insert(a,b,-c);//寻常的连边
if(t==2) insert(b,a,c);//
}
for(int i=1;i<=n;i++) insert(0,i,0);//万一不连通的话,每一个联通的区域都有可能有负权圈
if(spfa()) printf("Yes");//bool型 spfa
else printf("No");
return 0;
}
这样子,小\(f\)再也 不用b担心自己的\(spfa\)被卡了
Luogu P1993 题解的更多相关文章
- 【luogu P1993 小K的农场】 题解
题目链接:https://www.luogu.org/problemnew/show/P1993 1.差分约束: 对于a - b <= c 有一条 b-->a 权值为c 对于a - b & ...
- Luogu P1993 小 K 的农场
其实很早以前就打好了,但一直忘记写了. 也就是差分约束的模板题. 关于差分约束,也就是用来求关于一些不等式互相约束算出最优解. 推荐一个讲的很好的博客:http://www.cppblog.com/m ...
- [Luogu] P1993 小K的农场
题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...
- luogu 3426题解 (KMP)
题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很多次,但是一个位置 ...
- Luogu P4643 【模板】动态dp
题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把 ...
- 【Luogu 1993】差分约束系统问题——小K的农场
Luogu P1993 前置知识:最短路径相关算法 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统. 显然题目中给出 ...
- [题解向] CF#Global Round 1の题解(A $\to$ G)
这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...
- [luogu]P1053 篝火晚会[数学][群论]
[luogu]P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同 ...
- 8.20~8.25刷散题记录 By cellur925
记录一些散题 / 价值不大但还是想记下来的题目 / 没正八经写博客的题目 8.24 Luogu P1508 沙雕题数字三角形的二维升级版,但是注意阅读理解,李大水牛从桌子最后一行下侧开始吃,而本题是自 ...
随机推荐
- 面试官:“看你简历上写熟悉 Handler 机制,那聊聊 IdleHandler 吧?”
一. 序 Handler 机制算是 Android 基本功,面试常客.但现在面试,多数已经不会直接让你讲讲 Handler 的机制,Looper 是如何循环的,MessageQueue 是如何管理 M ...
- Jmeter之上传文件
前言 我们可以利用postman工具来测试上传文件的接口,那么假如要利用Jmeter工具来进行上传接口的测试,又该如何测试呢? 上传文件的接口地址:/pinter/file/api/upload:接口 ...
- qt creator源码全方面分析(2-10-4)
目录 Plugin Life Cycle Plugin Life Cycle 为了能够编写Qt Creator插件,您必须了解启动或关闭Qt Creator时,插件管理器所采取的步骤. 本节详细描述插 ...
- pytorch之 activation funcion
import torch import torch.nn.functional as F from torch.autograd import Variable import matplotlib.p ...
- 数据算法 --hadoop/spark数据处理技巧 --(5.移动平均 6. 数据挖掘之购物篮分析MBA)
五.移动平均 多个连续周期的时间序列数据平均值(按相同时间间隔得到的观察值,如每小时一次或每天一次)称为移动平均.之所以称之为移动,是因为随着新的时间序列数据的到来,要不断重新计算这个平均值,由于会删 ...
- 【GET TIPS】Chrome所见即所得的截图技巧
精简的前言: 对,我就是想说下事情的来龙去脉.您要不想听,就把耳朵捂起来23333. 想截个新冠肺炎病毒,全国确诊人数今日增长的图,以确定非湖北地区不再明显增长. 但由于网页需要的内容分布在两页,需要 ...
- 仅需60秒,使用k3s创建一个多节点K8S集群!
作者: Dawid Ziolkowski丨Container Solution云原生工程师 最近,我一直在Kubernetes上进行各种测试和部署.因此,我不得不一次又一次创建和销毁Kubernete ...
- C#设计模式学习笔记:(21)访问者模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8135083.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第九个模式--访 ...
- Android中实现照片滑动时左右进出的动画的xml代码
场景 Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- vue自定义分页组件---切图网
vue2.5自定义分页组件 Pagination.vue,可设置每页显示条数,带跳转框直接跳转到相应页面,亲测有用.目前很多框架自带有分页组件比如elementUI,不过在面对一个拿到PSD稿,然后重 ...