题目传送门

题目描述

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

  差分约束求可行解。判负环的时候spfa用stack代替queue会快很多。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 #include<stack>
 8 #include<bitset>
 9 #define LL long long
10 #define RI register int
11 using namespace std;
12 const int INF = 0x7ffffff ;
13 const int N = 10000 + 10 ;
14
15 inline int read() {
16     int k = 0 , f = 1 ; char c = getchar() ;
17     for( ; !isdigit(c) ; c = getchar())
18       if(c == '-') f = -1 ;
19     for( ; isdigit(c) ; c = getchar())
20       k = k*10 + c-'0' ;
21     return k*f ;
22 }
23 struct Edge {
24     int to, next, val ;
25 }e[N<<1] ;
26 int n, m ; int head[N], dis[N], num[N] ;
27 inline void add_edge(int x,int y,int z) {
28     static int cnt = 0 ;
29     e[++cnt].to = y, e[cnt].next = head[x], head[x] = cnt, e[cnt].val = z ;
30 }
31
32 inline bool spfa() {
33     memset(dis,127,sizeof(dis)) ; dis[0] = 0 ;
34     stack<int>s ; s.push(0) ; bitset<N>ins ; ins[0] = 1 ;
35     while(!s.empty()) {
36         int x = s.top() ; s.pop() ; num[x]++ ; if(num[x] > n) return 0 ;
37         for(int i=head[x];i;i=e[i].next) {
38             int y = e[i].to ;
39             if(dis[y] > dis[x]+e[i].val) {
40                 dis[y] = dis[x]+e[i].val ;
41                 if(!ins[y]) {
42                     s.push(y) ; ins[y] = 1 ;
43                 }
44             }
45         }
46         ins[x] = 0 ;
47     }
48     return 1 ;
49 }
50
51 int main() {
52     n = read(), m = read() ;
53     while(m--) {
54         int ii = read() ;
55         if(ii == 1) {
56             int x = read(), y = read(), z = read() ;
57             add_edge(y,x,-z) ;
58         } else if(ii == 2) {
59             int x = read(), y = read(), z = read() ;
60             add_edge(x,y,z) ;
61         } else {
62             int x = read(), y = read() ;
63             add_edge(y,x,0), add_edge(x,y,0) ;
64         }
65     }
66     for(int i=1;i<=n;i++) add_edge(0,i,0) ;
67     if(spfa()) printf("Yes") ;
68     else printf("No") ;
69     return 0 ;
70 }

转载于:https://www.cnblogs.com/zub23333/p/8831191.html

小K的农场(luogu P1993相关推荐

  1. P1993 小 K 的农场

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

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

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

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

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

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

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

  5. bzoj3436小K的农场

    bzoj3436小K的农场 题意: n个数,知道m条关系:a-b≥c.a-b≤c或a==b.问是否存在满足所有关系的情况.n≤10000,m≤10000. 题解: 差分约束.因为只要求是否满足,因此最 ...

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

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

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

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

  8. 洛谷P1993 小K的农场(差分约束)

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

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

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

最新文章

  1. OpenSSL使用指南
  2. SpringBoot笔记:SpringBoot启动参数配置
  3. Java 第四周总结
  4. leetcode 260. Single Number III | 260. 只出现一次的数字 III(位运算:分组异或)
  5. 链表应用——多项式相加
  6. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了
  7. 机器学习导论 与数学分析
  8. jp摩根的人都在学python么_摩根大通已要求所有资管部门员工必须学习编程
  9. 每年扫码千亿次!微信官方开源了自家优化的二维码引擎!3行代码让你拥有微信扫码能力...
  10. python可以怎么玩_这波太炸了!Python脚本可视化居然可以这么玩!
  11. ARFoundation系列讲解-教程目录
  12. adblock插件_为WordPress创建一个反AdBlock插件
  13. 详细介绍如何从零开始制作51单片机控制的智能小车(一)———让小车动起来
  14. 为什么人家每天睡觉是自然醒,我每天是穷醒?
  15. 知乎700万人围观:华为65万年薪,公务员18万年薪,怎么选?
  16. VBA操作WORD(五)批量调整图片大小、居中设置
  17. 电脑录屏方法qq录屏
  18. VCL语法教程——5.手持式1311编程器的支持
  19. 【金融案例分析03】深度解读:光大证券乌龙指事件是怎么回事?(套利交易、基金背后的金融原理,事件的过程与定性)
  20. /proc/cpuinfo参数说明查看CPU参数

热门文章

  1. 将用户名保存至cookie中
  2. 在CcentOS系统上将deb包转换为rpm包
  3. 淘淘商城学习笔记 之 上传图片到远程服务器,图片的回显出现的bug
  4. CSS:给 input 中 type=text 设置CSS样式
  5. mac 安装Android sdk以便开展appium android自动化测试
  6. Maven 之常用命令
  7. hdu4403暴力搜索
  8. Android-View点击水波纹特效
  9. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )
  10. 【Android 逆向】Android 逆向通用工具开发 ( adb forward 网络端口重定向命令 | PC 端逆向程序主函数分析 )