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

  • 农场 a a a比农场 b b b至少多种植了 c c c个单位的作物;
  • 农场 a a a比农场 b b b至多多种植了 c c c个单位的作物;
  • 农场 a a a与农场 b b b种植的作物数一样多。

但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。

【输入格式】
第一行包括两个整数 n n n和 m m m,分别表示农场数目和小K记忆中的信息数目。
接下来 m m m行:

  • 如果每行的第一个数是 1 1 1,接下来有三个整数 a , b , c a,b,c a,b,c,表示农场 a a a比农场 b b b至少多种植了 c c c个单位的作物;
  • 如果每行的第一个数是 2 2 2,接下来有三个整数 a , b , c a,b,c a,b,c,表示农场 a a a比农场 b b b至多多种植了 c c c个单位的作物;
  • 如果每行的第一个数是 3 3 3,接下来有两个整数 a , b a,b a,b,表示农场 a a a种植的的数量和 b b b一样多。

【输出格式】
如果存在某种情况与小K的记忆吻合,输出Yes,否则输出No

【数据范围】
1 ≤ n , m , a , b , c ≤ 5 × 1 0 3 1 \le n,m,a,b,c \le 5 \times 10^3 1≤n,m,a,b,c≤5×103

【输入样例】

3 3
3 1 2
1 1 3 1
2 2 3 2

【输出样例】

Yes

【分析】


将题目所给的三种情况用以下不等式表示:

  • a − b ≥ c ⟺ a ≥ b + c a-b\ge c\iff a\ge b+c a−b≥c⟺a≥b+c,即 a d d ( b , a , c ) add(b,a,c) add(b,a,c)
  • a − b ≤ c ⟺ b ≥ a − c a-b\le c\iff b\ge a-c a−b≤c⟺b≥a−c,即 a d d ( a , b , − c ) add(a,b,-c) add(a,b,−c)
  • a = b ⟺ a ≥ b , b ≥ a a=b\iff a\ge b,b\ge a a=b⟺a≥b,b≥a,即 a d d ( a , b , 0 ) , a d d ( b , a , 0 ) add(a,b,0),add(b,a,0) add(a,b,0),add(b,a,0)

每个农场的作物不会为负数个,即 x i ≥ 0 x_i\ge 0 xi​≥0。我们建立虚拟源点 x 0 = 0 x_0=0 x0​=0,则 x i ≥ x 0 + 0 x_i\ge x_0+0 xi​≥x0​+0,即 a d d ( 0 , x i , 0 ) add(0,x_i,0) add(0,xi​,0)。而且观察到虚拟源点可以走到其它任意一点,因此满足差分约束条件,对于本题,我们只需要判断是否存在正环即可。


【代码】

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;const int N = 5010, M = 15010;
int e[M], ne[M], d[M], h[N], idx;
int dis[N], cnt[N];
bool st[N];
int n, m;void add(int u, int v, int w)
{e[idx] = v, d[idx] = w, ne[idx] = h[u], h[u] = idx++;
}bool spfa(int s)
{memset(dis, 0x8f, sizeof dis);queue<int> Q;Q.push(s);dis[s] = 0;st[s] = true;while (Q.size()){int t = Q.front();Q.pop();st[t] = false;for (int i = h[t]; ~i; i = ne[i])if (dis[t] + d[i] > dis[e[i]]){dis[e[i]] = dis[t] + d[i];cnt[e[i]] = cnt[t] + 1;if (cnt[e[i]] >= n + 1) return true;//存在正环if (!st[e[i]]) Q.push(e[i]), st[e[i]] = true;}}return false;
}int main()
{cin >> n >> m;memset(h, -1, sizeof h);for (int i = 1; i <= n; i++) add(0, i, 0);//i >= 0 -> x0 + 0 <= iwhile (m--){int op, a, b, c;cin >> op >> a >> b;if (op == 1) { cin >> c; add(b, a, c); }//a - b >= celse if (op == 2) { cin >> c; add(a, b, -c); }//a - b <= celse add(b, a, 0), add(a, b, 0);// a == b -> a >= b && a <= b}if (spfa(0)) puts("No");else puts("Yes");return 0;
}

洛谷P1993 小K的农场(差分约束)相关推荐

  1. P1993 小K的农场 (差分约束)

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

  2. BZOJ 3436: 小K的农场( 差分约束 )

    orz云神... 真的给跪了...BFS版spfa T 掉了...然后DFS版的就A了...我现在很迷茫.... 这就是个普通的差分约束... ---------------------------- ...

  3. BZOJ 3436 小K的农场 差分约束

    Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个 ...

  4. P1993 小 K 的农场

    P1993 小 K 的农场 题解: 农场 a 比农场 b 至少多种植了 c 个单位的作物: 这句话说明:a - b > = c 转化可得 b - a < = - c add(a,b,-c) ...

  5. 【差分约束】POJ3159/LG P1993 小K的农场

    终于把差分约束刷完了!!,这些题的套路都是很类似的 题目描述小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种 ...

  6. 洛谷P7515:矩阵游戏(差分约束)

    解析 如果没有元素均要在 [0,1e6][0,1e6][0,1e6] 的条件,可以很容易的构造出一个合法解. 那么我们就要通过调整得到的解,使所有数都在合法范围内. 注意到,每次给某一行/列依次+1, ...

  7. bzoj 3436: 小K的农场(差分约束)

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1824  Solved: 810 [Submit][Status][Disc ...

  8. [BZOJ]3436: 小K的农场

    题解:  差分约束 模板题 差分约束系统  联系 最短路 对于操作1:$ a-b\geqslant c\rightarrow b\leqslant a-c $ 也就是说a向b连一条-c的边 对于操作2 ...

  9. 2017提高组D1T1 洛谷P3951 小凯的疑惑

    洛谷P3951 小凯的疑惑 原题 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想 ...

最新文章

  1. 5.4任务进展情况(整理——郑云飞)
  2. linux 找出耗io的,linux根据io消耗找进程
  3. java求职攻略_2020年求职攻略 《Java面试连成诀》教程免费分享
  4. cocos2dx游戏--欢欢英雄传说--添加游戏背景
  5. 数据库面试 - 分库分表
  6. 每个人都该知道的数字
  7. photoshop 插件_Photoshop的线性光
  8. 日活两亿的快手,如何用AI理解视频、做好分发
  9. php kb转换成字节,将kB换算为MB (千字节换算为兆字节)
  10. 关于修改了网页源文件但是网站显示却没变的问题解决
  11. java集合之trove4j高性能集合库
  12. 深入浅出解析AR/VR/MR三者之间的联系和区别
  13. iOS UIAppearance使用详解
  14. 本地搭建私有云盘:虚拟机安装群晖NAS 1/5
  15. [阅读记录]《数据分析师求职面试指南》-2
  16. 系统架构设计笔记(13)—— 数据挖掘
  17. 世界各地的土豆代表吃法
  18. Fatal error: Cannot declare class ComposerAutoloadComposerStaticInit,composer升级后报错
  19. 西邮Linux2020年面试题
  20. iso认证规则是什么,iso认证项目有哪些?

热门文章

  1. 很遗憾,区块链永远无法解决疫苗问题
  2. Linux: tmux工具
  3. Lecture 14 Context-Free Grammar
  4. linux如何美化桌面图标,桌面应用|使用 GNOME 优化工具自定义 Linux 桌面的 10 种方法...
  5. [链接]通俗易懂Word 2003 视频教程(Flash教程)
  6. 使用FileZilla上传和下载远程Linux服务器文件
  7. Java Bean详解
  8. sql 清空表数据、删除表数据、主键从1开始
  9. 解决Ubuntu 20.04 使用快捷键不能锁屏的问题
  10. bootstrap-table 合并单元格方法