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 沙雕题数字三角形的二维升级版,但是注意阅读理解,李大水牛从桌子最后一行下侧开始吃,而本题是自 ...
随机推荐
- Go语言实现:【剑指offer】二叉搜索树与双向链表
该题目来源于牛客网<剑指offer>专题. 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. Go语言实现: type T ...
- 【CMake】CMake ERROR:could not find git for clone of
在使用 CMake 构建VS2015项目时遇到一个错误提示:could not find git for clone of. 因为项目需要从GitHub导入运行库,但构建项目时提示未能找到这个库,而g ...
- Java 添加、读取、删除Excel文档属性
在文档属性中,可以设置诸多关于文档的信息,如创建时间.作者.单位.类别.关键词.备注等摘要信息以及一些自定义的文档属性.下面将通过Java程序来演示如何设置,同时对文档内的已有信息,也可以实现读取和删 ...
- docker配置容器运行jar包
拉取jdk镜像文件 # docker pull huanwei/alpine-oraclejdk8 创建文件夹编写Dockerfile文件 # mkdir docker # vi Dockerfile ...
- Linux运维---磁盘存储-2. RAID
随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...
- C# bubble sort,selection sort,insertion sort
static void Main(string[] args) { InsertionSortDemo(); Console.ReadLine(); } static void InsertionSo ...
- spring cloud微服务快速教程之(五) ZUUL API网关中心
0-前言 我们一个个微服务构建好了,外部的应用如何来访问内部各种各样的微服务呢?在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务.当添加API网 ...
- idea unable to import maven see logs for details
问题描述 环境IEAD,Maven3.6.2 2019-09-09 17:29:10,751 [ 839683] ERROR - #org.jetbrains.idea.maven - Intelli ...
- css基本概念与css核心语法介绍
css基本概念 css是什么?不需要了解太多文字类介绍,记住css是层叠样式表,HTML是页面结构,css负责页面样式,javascrt负责静态页面的交互.CSS 能够对网页中元素位置的排版进行像素级 ...
- w13scan扫描器的使用
0x01 w13scan第三方包下载 环境:python3以上 下载:pip install w13scan 0x02 利用w13scan API接口编写w13scan.py from W13SCAN ...