洛谷P1993 小K的农场 [差分约束系统]
小K的农场
题目描述
小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:
- 农场a比农场b至少多种植了c个单位的作物,
- 农场a比农场b至多多种植了c个单位的作物,
- 农场a与农场b种植的作物数一样多。
但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。
输入输出格式
输入格式:
第一行包括两个整数 n 和 m,分别表示农场数目和小 K 记忆中的信息数目。
接下来 m 行:
如果每行的第一个数是 1,接下来有 3 个整数 a,b,c,表示农场 a 比农场 b 至少多种植了 c 个单位的作物。
如果每行的第一个数是 2,接下来有 3 个整数 a,b,c,表示农场 a 比农场 b 至多多种植了 c 个单位的作物。如果每行的第一个数是 3,接下来有 2 个整数 a,b,表示农场 a 种植的的数量和 b 一样多。
输出格式:
如果存在某种情况与小 K 的记忆吻合,输出“Yes”,否则输出“No”。
输入输出样例
3 3
3 1 2
1 1 3 1
2 2 3 2
Yes
说明
对于 100% 的数据保证:1 ≤ n,m,a,b,c ≤ 10000。
分析:
差分约束系统的裸题,用来练练。
三种条件分别可以转换成:
$1:dis[a]\geq dis[b]+c$
$2:dis[b]\geq dis[a]-c$
$3:dis[a]\geq dis[b]+0,dis[b]\geq dis[a]+0$
其中第三种条件可以放心建边,因为题目本身的要求就只是查看是否有负环就行了,只要无负环就输出$Yes$,有负环就输出$No$。因为是判断负环,所以用$dfs$版$SPFA$(一开始打了个$BFS$版,然后死活要$WA$一个点。。。。)。
Code:
//It is made by HolseLee on 21st Aug 2018
//Luogu.org P1993
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<vector>
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
using namespace std; const int N=1e4+;
int n,m,dis[N],tim[N];
bool vis[N],flag;
struct Node{
int to,val;
Node(int x=,int y=){
to=x,val=y;
}
};
vector<Node>e[N];
queue<int>team; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} void spfa(int u)
{
vis[u]=true;
int v;
for(int i=;i<e[u].size();++i){
v=e[u][i].to;
if(dis[v]>dis[u]+e[u][i].val){
if(vis[v])flag=false;return;
dis[v]=dis[u]+e[u][i].val;
spfa(v);
}
}
vis[u]=false;
} int main()
{
n=read();m=read();
int x,y,z,v;
for(int i=;i<=m;++i){
x=read(),y=read(),z=read();
switch(x){
case :v=read();e[z].push_back(Node(y,v));break;
case :v=read();e[y].push_back(Node(z,-v));break;
case :e[y].push_back(Node(z,));e[z].push_back(Node(y,));break;
}
}
flag=true;
for(int i=;i<=n;++i){
dis[i]=;
spfa(i);
if(!flag)break;
}
if(flag)printf("Yes\n");
else printf("No\n");
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 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...
- 『题解』洛谷P1993 小K的农场
更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...
- 洛谷 P1993 小K的农场 题解
每日一题 day55 打卡 Analysis 这是我们一次考试的T1,但我忘了差分约束系统怎么写了,所以就直接输出Yes混了60分 首先转化题目: 1:表示农场 a 比农场 b 至少多种植了 c 个单 ...
- P1993 小K的农场 差分约束系统
这个题是一道差分约束系统的裸题,什么是差分约束系统呢?就是给了一些大小条件,然后让你找一个满足的图.这时就要用差分约束了. 怎么做呢?其实很简单,就是直接建图就好,但是要把所有条件变为小于等于号,假如 ...
- 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)
看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...
- 洛谷P1993 小K的农场_差分约束_dfs跑SPFA
Code: #include<cstdio> #include<queue> using namespace std; const int N=10000+233; const ...
- 洛谷P1993 小K的农场
思路是差分约束+dfs版SPFA. 首先来思考差分约束的过程,将题目给出的式子进行转化: 农场a比农场b至少多种植了c个单位的作物, SPFA我们考虑跑最短路,那么要让SPFA中满足的式子就是if(d ...
随机推荐
- java中BigDecimal在金融行业中的使用
1.引言 在java语言中,double和float用于二进制浮点型计算,无法得到精确的结果.而BigDecimal则用于精确的计算.不超过16位有效数字(最好是不超过13位)的科学和工程计算,可以使 ...
- Redhat安装配置VNC服务器
1. 检查安装VNC服务器 # rpm -qa|grep vnc 如果返回信息中有tigervnc-server,说明已安装了VNC:如果没有: # yum install tigervnc # yu ...
- 用Matlab实现字符串分割(split)
用Matlab实现字符串分割(split)Posted on 2011/08/08 Matlab的字符串处理没有C#强大,本身又没有提供OO特性,需要依赖别的手段完成这项任务. 我们在这里借助正则表达 ...
- 【BZOJ2683】简单题 [分治][树状数组]
简单题 Time Limit: 50 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 你有一个N*N的棋盘,每个格子内有一 ...
- 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集
[题目]D. Best Edge Weight [题意]给定n个点m条边的带边权无向连通图,对每条边求最大边权,满足其他边权不变的前提下图的任意最小生成树都经过它.n,m<=2*10^5,1&l ...
- Python :集合类型(set)
set 是一个无序的元素集合,支持并.交.差及对称差等数学运算, 但由于 set 不记录元素位置,因此不支持索引.分片等序列的操作. 一.初始化 s0 = set() d0 = {} s1 = {0} ...
- form表单设置input文本属性只读,不可更改
记住一条好用的,设置readonly属性为true <input readonly=''true"> 更多方法,转载: http://www.jb51.net/web/6 ...
- 【洛谷 P4016】 负载平衡问题(费用流)
题目链接 环形均分纸牌,既然是网络流23题的那就用网络流做把. 套路拆点. 供需平衡. 源点向大于平均数的点的入点连流量为这个数减去平均数的差,费用为0的边,表示需要移走这么多. 小于平均数的点的出点 ...
- 1030 大数进制转换(51Nod + JAVA)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1030 题目: 代码实现如下: import java.mat ...
- linux的防火墙管理
换oricle-linux7系统后,发现iptables的管理方法有不小的改动,记录一下遇到的问题. iptables linux系统已经默认安装了iptables和firewalld两款防火墙管理工 ...