题目描述

小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”。

输入输出样例

输入样例#1: 复制

3 3
3 1 2
1 1 3 1
2 2 3 2
输出样例#1: 复制

Yes

说明

对于 100% 的数据保证:1 ≤ n,m,a,b,c ≤ 10000。

思路:设d[i]表示第i个点的数值。

那么对于约束

  1:d[a]-d[b]>=c

  2:d[a]-d[b]<=c

  3:d[a]=d[b]

让我们稍微变化一下式子

  1:d[b]<=d[a]-c

  2:d[a]<=d[b]+c

  3:d[a]<=d[b]+0,d[b]<=d[a]+0

这不是和最短路中dist的定义很像吗?每个点的距离都小于等于能到他的点的距离+边权。

于是我们将其转化成一个最短路模型。

对于约束

  1:我们连边(a,b,-c).

  2:我们连边(b,a,c).

  3:我们连边(a,b,0),(b,a,0)。

因为d[i]>=0,所以我们建一个起点s,向所有点连一条(s,i,0)的边。

然后d[s]显然=0.

我们发现这样子跑一个最短路就能确定每个点的d值啦

那什么时候是无解呢?当然是无法确定每个点的最短路的时候,也就是图中存在负权环。

我们建完图以后判断是否存在负权环就可以啦。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
queue<int>que;
int n,m,tot,flag;
int dis[MAXN],vis[MAXN];
int to[MAXN],cap[MAXN],net[MAXN],head[MAXN];
void add(int u,int v,int w){
to[++tot]=v;cap[tot]=w;net[tot]=head[u];head[u]=tot;
}
void spfa(int x){
if(flag) return ;
vis[x]=;
for(int i=head[x];i;i=net[i])
if(dis[to[i]]>dis[x]+cap[i]){
dis[to[i]]=dis[x]+cap[i];
if(vis[to[i]]){ flag=;return ; }
spfa(to[i]);
}
vis[x]=;
}
int main(){
freopen("farm.in","r",stdin);
freopen("farm.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int opt,x,y,z;
scanf("%d",&opt);
if(opt==){
scanf("%d%d%d",&x,&y,&z);
add(x,y,-z);
} else if(opt==){
scanf("%d%d%d",&x,&y,&z);
add(y,x,z);
} else if(opt==){
scanf("%d%d",&x,&y);
add(x,y,);
add(y,x,);
}
}
for(int i=;i<=n;i++) add(,i,);
memset(dis,0x7f,sizeof(dis));
dis[]=;spfa();
if(flag) printf("No");
else printf("Yes");
}
/*
3 3
3 1 2
1 1 3 1
2 2 3 2
*/ /*
10 10
3 9 5
1 6 1 1
1 2 8 0
1 2 8 1
2 4 5 0
1 1 2 1
1 10 5 0
1 10 1 0
2 6 7 0
2 9 3 0
*/

洛谷 P1993 小K的农场的更多相关文章

  1. 洛谷 P1993 小K的农场 解题报告

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

  2. 洛谷P1993 小K的农场 [差分约束系统]

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

  3. 洛谷P1993 小 K 的农场

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

  4. 『题解』洛谷P1993 小K的农场

    更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...

  5. 洛谷P1993 小K的农场

    思路是差分约束+dfs版SPFA. 首先来思考差分约束的过程,将题目给出的式子进行转化: 农场a比农场b至少多种植了c个单位的作物, SPFA我们考虑跑最短路,那么要让SPFA中满足的式子就是if(d ...

  6. 洛谷P1993 小 K 的农场(查分约束)

    /* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ ...

  7. 洛谷 P1993 小K的农场 题解

    每日一题 day55 打卡 Analysis 这是我们一次考试的T1,但我忘了差分约束系统怎么写了,所以就直接输出Yes混了60分 首先转化题目: 1:表示农场 a 比农场 b 至少多种植了 c 个单 ...

  8. 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)

    看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...

  9. 洛谷P1993 小K的农场_差分约束_dfs跑SPFA

    Code: #include<cstdio> #include<queue> using namespace std; const int N=10000+233; const ...

随机推荐

  1. Math teacher's homework

    Title:[Math teacher's homework] Description 题目大意:给你n个数m1,m2...mn,求满足X1 xor X2 xor ... xor Xn=k,0< ...

  2. 使用JS分页 <span> beta 3.0 完成封装的分页

    <html> <head> <title>分页</title> <style> #titleDiv{ width:500px; backgr ...

  3. php pdo oracle

    <?php/** * Created by mestars. * User: mestars * Date: 6/13/16 * Time: 10:52 PM */header('Access- ...

  4. 笔试题的各种trick

    %x 默认去掉前导零 #include<stdint.h> #include<stdio.h> union X {     int32_t a;     struct      ...

  5. Mui使用jquery并且使用点击跳转新窗口

    网上好多朋友是这样做的: 全局插入了js代码 mui('body').on('tap', 'a', function () { document.location.href = this.href; ...

  6. 可以在一个html的文件当中读取另一个html文件的内容

    1.IFrame引入,看看下面的代码 <IFRAME NAME="content_frame" width=100% height=30 marginwidth=0 marg ...

  7. 用DataReader 分页与几种传统的分页方法的比较

    对于数据库的分页,目前比较传统的方法是采用分页存储过程,其实用 DataReader 也可以实现分页,不需要写存储过程,实现效率上也比几种比较流行的分页方法要略快. 在开始这个方法之前,让我们先创建一 ...

  8. (转)淘淘商城系列——Solr的安装

    http://blog.csdn.net/yerenyuan_pku/article/details/72874134 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service ...

  9. HTML5 实现Link跳线效果

    之前我们推出过Flex版本的Link跳线效果,现在基于HTML5新版本的跳线效果也实现了,细微之处我们进行了改进,如link倾斜的时候Offset方向始终保持垂直等.先看效果.实现的算法和Flex基本 ...

  10. xmpp之配置Xcode(1)

    介绍 ios上的XMPPFramework你能够在Xcode/iPhoneXMPP 目录找到,它只是实现了XMPP的一小部分功能. 下面主要介绍在开发XMPPFramework ios应用之前的配置工 ...