洛谷 P1993 小K的农场 题解
每日一题 day55 打卡
Analysis
这是我们一次考试的T1,但我忘了差分约束系统怎么写了,所以就直接输出Yes混了60分
首先转化题目:
1:表示农场 a 比农场 b 至少多种植了 c 个单位的作物。即a>=b+c 转化后为 b-a<=-c
2:表示农场 a 比农场 b 至多多种植了 c 个单位的作物。即a<=b+c 转化后为 a-b<=c
3:表示农场 a 与农场 b 种植数一样 即a=b 可以表示为 a-b<=0 与 b-a<=0
接下来就是判负环了 而为什么是判负环呢? 因为由题意可得 a>b且b>a一定是不合法的(即情况1的矛盾)而正环、正+负环、以及中间穿插0的情况都是合法的(脑补即可)
至于情况3我觉得是影响不大的 甚至会更容易理解,因为不是更优就不会选这条路。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 10010
#define rep(i,s,e) for(register int i=s;i<=e;++i)
#define dwn(i,s,e) for(register int i=s;i>=e;--i)
using namespace std;
inline int read()
{
int x=,f=;
char c=getchar();
while(c<''||c>'') {if(c=='-') f=-; c=getchar();}
while(c>=''&&c<='') {x=x*+c-''; c=getchar();}
return f*x;
}
int n,m,cnt;
int head[maxn],book[maxn],dis[maxn];
struct node
{
int v,w,nex;
}edge[*maxn];
inline int add(int x,int y,int z)
{
edge[++cnt].v=y;
edge[cnt].w=z;
edge[cnt].nex=head[x];
head[x]=cnt;
}
bool SPFA(int from)
{
book[from]=;
for(int i=head[from];i;i=edge[i].nex)
{
int to=edge[i].v,val=edge[i].w;
if(dis[to]>dis[from]+val)
{
dis[to]=dis[from]+val;
if(book[to]==true) return false;
if(SPFA(to)==false) return false;
}
}
book[from]=;
return true;
}
int main()
{
memset(dis,,sizeof(dis));
n=read();m=read();
rep(i,,m)
{
int in=read();
if(in==)
{
int a=read(),b=read(),c=read();
add(a,b,-c);
}
else if(in==)
{
int a=read(),b=read(),c=read();
add(b,a,c);
}
else if(in==)
{
int a=read(),b=read();
add(a,b,);
add(b,a,);
}
}
rep(i,,n) add(n+,i,);
dis[n+]=;
if(SPFA(n+)==true) printf("Yes");
else printf("No");
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)
洛谷 P1993 小K的农场 题解的更多相关文章
- 洛谷 P1993 小K的农场 解题报告
P1993 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...
- 洛谷 P1993 小K的农场
P1993 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...
- 洛谷P1993 小K的农场 [差分约束系统]
题目传送门 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...
- 『题解』洛谷P1993 小K的农场
更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...
- 洛谷P1993 小 K 的农场
题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...
- 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)
看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...
- 洛谷P1993 小K的农场
思路是差分约束+dfs版SPFA. 首先来思考差分约束的过程,将题目给出的式子进行转化: 农场a比农场b至少多种植了c个单位的作物, SPFA我们考虑跑最短路,那么要让SPFA中满足的式子就是if(d ...
- 洛谷P1993 小 K 的农场(查分约束)
/* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ ...
- 洛谷P1993 小K的农场_差分约束_dfs跑SPFA
Code: #include<cstdio> #include<queue> using namespace std; const int N=10000+233; const ...
随机推荐
- 【mysql】获取某个表所有列名【mybatis】
方法1:[仅指定表名] select COLUMN_NAME from information_schema.COLUMNS where table_name = 'your-table-name'; ...
- Mysql获取字符串中的数字函数方法和调用
)) ) BEGIN ; ) default ''; set v_length=CHAR_LENGTH(Varstring); DO )) )) ) THEN )); END IF; ; END WH ...
- Android开发DDMS找不到Emulator Control的方法
1.右键DDMS,点击reset. 2.window->show view->other->android->Emulator Control
- windows下vmware和Hyper-v共存方法
问题描述:环境:windows server 2012 r2系统下安装Hyper-v后,再安装Vmware 在Vmware中创建虚拟机,安装虚拟机系统的时候,vmware提示:VMware Works ...
- iOS - 架构的认识过程,悬崖勒马。
16年的时候写过一篇代码讲解的,依旧是这三种架构,现在20年将近了,看到好的文章,是否增加新的认识. 16年链接 iOS - 架构模式 - 解密 MVC.MVP.MVVM.VIPER架构 新项目选择架 ...
- Vue学习之生命周期钩子小结(四)
一.生命周期钩子(函数): 1.每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等.同时在这个过程中也会运 ...
- SpringBoot,SSM和SSH
Springboot的概念: 是提供的全新框架,使用来简化Spring的初始搭建和开发过程,使用了特定的方式来进行配置,让开发人员不在需要定义样板化的配置.此框架不需要配置xml,依赖于想MAVEN这 ...
- 排序算法的c++实现——堆排序
我们利用最大堆可以实现数组从小到大的原址排序,利用最小堆的可以实现对数组从大到小的原址排序. 1 二叉堆的简单介绍: 最大堆与最小堆可以当作通过数组来实现的一个完全二叉树,除了最底层之外其它层都是满 ...
- 共享变量与python测试库
共享变量(Variables) 1.变量表: 导入模式: 1.套件文件,不需要导入 2.资源文件 Resource xxx.robot 2.变量文件 导入模式: 1.Variables xx.py ...
- Redis系列-第六篇哨兵模式
https://blog.csdn.net/niugang0920/article/details/97141175 Redis的主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工将从节点晋 ...