p1993 小康的农场

CSP_S 1=之后就没怎么写题解。。

推荐博客食用

预备知识

明显这是一道差分约束的题,以下简称差分

有些人可能不了解差分,请点 [传送门]

至于用差分做的题的特征,无一都是你可以列出每个变量之间的一些不等关系,就如下

\[\begin{cases}
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}
\]

对于这样的题我们把他转化为一个图来解决

具体实现是:

  1. 对于一个不等关系,把它转化为形如\(x-y \le c\)的式子
  2. 由\(y\)向\(x\)连一条权为c的边
  3. 若是‘=’ 号,转化为\(x-y \le c\)和\(y-x \le c\),来处理
  4. 构建一个\(0\)节点,对每个节点的边权都为\(0\),防止图不连通,而且这样不会影响最短路
  5. 跑一次最短路,因为有负权用spfa

大体的步骤,就是这些了

重点

但是,这道题显得奇奇怪怪,为啥呢,用朴素的SPFA跑出TLE了,看题解都是用的dfs优化,可我偏不,事实上是不想删代码,我加了容错SLFmcfx,就轻松过掉了,时间优化巨大

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 题解的更多相关文章

  1. 【luogu P1993 小K的农场】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1993 1.差分约束: 对于a - b <= c 有一条 b-->a 权值为c 对于a - b & ...

  2. Luogu P1993 小 K 的农场

    其实很早以前就打好了,但一直忘记写了. 也就是差分约束的模板题. 关于差分约束,也就是用来求关于一些不等式互相约束算出最优解. 推荐一个讲的很好的博客:http://www.cppblog.com/m ...

  3. [Luogu] P1993 小K的农场

    题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...

  4. luogu 3426题解 (KMP)

    题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很多次,但是一个位置 ...

  5. Luogu P4643 【模板】动态dp

    题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把 ...

  6. 【Luogu 1993】差分约束系统问题——小K的农场

    Luogu P1993 前置知识:最短路径相关算法 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统. 显然题目中给出 ...

  7. [题解向] CF#Global Round 1の题解(A $\to$ G)

    这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...

  8. [luogu]P1053 篝火晚会[数学][群论]

    [luogu]P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同 ...

  9. 8.20~8.25刷散题记录 By cellur925

    记录一些散题 / 价值不大但还是想记下来的题目 / 没正八经写博客的题目 8.24 Luogu P1508 沙雕题数字三角形的二维升级版,但是注意阅读理解,李大水牛从桌子最后一行下侧开始吃,而本题是自 ...

随机推荐

  1. Go语言实现:【剑指offer】数组中只出现一次的数字

    该题目来源于牛客网<剑指offer>专题. 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 正常能想到哈希表来处理,但此题考查的是异或的知识, ...

  2. Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数

    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数 题目描述 给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数 输入描述: 第一行一个数n 第 ...

  3. 我的一个React路由嵌套(多级路由),路由传参之旅

    在上一篇react路由之旅中,我们简单地配置了react,进行了react路由及相关知识的学习,引入以及实现一个局部跳转的功能,接下来就是深入学习路由的嵌套以及传参,这是工作中主要用要的. 我的rea ...

  4. 一键安装apache-2.4.38脚本

    [root@lamp scripts]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@lamp scripts ...

  5. 神奇的 SQL 之 WHERE 条件的提取与应用

    开心一刻 小明:为什么中国人结婚非要选一个好日子呢 ? 楼主:嗯 ? 那肯定啊,结完婚之后你还能有好日子吗 ? 小明:那结婚时所说的白头到老是真的吗 ? 楼主:这哪能是真的,你看现在,头发还没白就秃了 ...

  6. 使用Webpack的代码拆分在Vue中进行懒加载

    参考学习:https://alexjover.com/blog/lazy-load-in-vue-using-webpack-s-code-splitting/ 学习文案:https://webpac ...

  7. SQL Server 2019 安装教程

    SQL Server 2019 安装教程 下载安装SQL: 1.下载SQL Server 2019 Developer 官方网址:下载地址. 2.下拉选择免费版本,直接点击下载(别问,问就是家境贫寒

  8. C# NewtonJson Serialize and deserialize

    using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...

  9. 《果壳中的C# C# 5.0 权威指南》 - 学习笔记

    <果壳中的C# C# 5.0 权威指南> ========== ========== ==========[作者] (美) Joseph Albahari (美) Ben Albahari ...

  10. 方法中this指向的问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...