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 沙雕题数字三角形的二维升级版,但是注意阅读理解,李大水牛从桌子最后一行下侧开始吃,而本题是自 ...
随机推荐
- 全网最详细的Linux命令系列-Screen远程会话命令
screen 管理你的远程会话 你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份.ftp 传输等等.通常情况下我们都 ...
- 如何开始阅读ASP.NET Core源代码
背景 当我们对ASP.Net Core内部的某些方法.类的实现感兴趣时,有很多方法可以去了解,看书,看各种文章,但是最直接也是最深入的办法就是去阅读源代码.ASP.NET Core的源代码托管在Git ...
- Sparc V8
Sparc V8指令 在sparc V8手册中p83(Table A-1 Mapping of Synthetic Instructions to SPARC Instructions)有合成指令sy ...
- Error serializing object:序列化对象时出错
序列化对象时出错 :Error serializing object. Error serializing object. Cause: java.io.NotSerializableExceptio ...
- Task.Run()方法总结
一.从异步方法的声明说起 无返回值的类型异步方法 (1)public async Task MethodName() 带返回值类型的异步方法 (2)public async Task<TResu ...
- 工作五年的.neter的一些经历感想和对未来的一些疑惑
本次疫情在家办公快一个月了,节省了上下班的时间,外出活动时间,感觉有好多时间可以利用.人一闲下来就容易想事情,很多事情想不通心里堵的厉害,做事都提不起兴趣.至于想些什么呢,我给大家摆一下. 我的经历 ...
- P1058 立体图
链接:Miku ------------------------------ 蒟蒻在线%lmk,ljx,lpy,yyq大佬们 ------------------------------ Good N ...
- 《Git 从入门到体系》- 写给自己的话
我听过的对我很有冲击力的观点是:知识不成体系就是垃圾.这个观点不一定对,但是却是给我的冲击很大. 我记得以前在咖啡馆和一个博士医生聊天,他提出了这个观点:知识不成体系就是垃圾.听了这个观点我很想反驳他 ...
- 基于S2SH开发学生考勤管理系统 附源码
开发环境: Windows操作系统开发工具:Eclipse+Jdk+Tomcat+mysql数据库 运行效果图 源码及原文链接:http://javadao.xyz/forum.php?mod=vie ...
- MySQL 的一条语句是怎么执行的
该文为< MySQL 实战 45 讲>的学习笔记,感谢查看,如有错误,欢迎指正 一.MySQL 的基础架构 以下就是 MySQL 的基础架构图. 在 Linux 中安装 MySQL 时,最 ...