题目描述

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

思路:

显然是到差分约束裸题

对于第一个关系,我们建一条a->b边权为c的边

对于第二个关系,我们建一条b->a边权为-c的边

对于第三个关系,我们建a->b与b->a两条边权为0的边

然后我们用spfa跑最长路即可

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<queue>
  5. #define rii register int i
  6. #define rij register int j
  7. using namespace std;
  8. int n,m,cnt,vis[],head[],last[],jl[];
  9. queue<int>q;
  10. struct ljb{
  11. int to,val,nxt,from;
  12. }x[];
  13. void add(int from,int to,int val)
  14. {
  15. cnt++;
  16. x[cnt].from=from;
  17. x[cnt].val=val;
  18. x[cnt].to=to;
  19. if(head[from]==)
  20. {
  21. head[from]=cnt;
  22. }
  23. if(last[from]!=)
  24. {
  25. x[last[from]].nxt=cnt;
  26. }
  27. last[from]=cnt;
  28. }
  29. bool spfa(int st)
  30. {
  31. vis[st]=;
  32. for(rii=head[st];i!=;i=x[i].nxt)
  33. {
  34. if(jl[x[i].to]<jl[st]+x[i].val)
  35. {
  36. jl[x[i].to]=jl[st]+x[i].val;
  37. if(vis[x[i].to]!=)
  38. {
  39. return false;
  40. }
  41. if(spfa(x[i].to)==false)
  42. {
  43. return false;
  44. }
  45. }
  46. }
  47. vis[st]=;
  48. return true;
  49. }
  50. int main()
  51. {
  52. scanf("%d%d",&n,&m);
  53. for(rii=;i<=n;i++)
  54. {
  55. jl[i]=-;
  56. }
  57. for(rii=;i<=m;i++)
  58. {
  59. int p,from,to,val;
  60. scanf("%d%d%d",&p,&from,&to);
  61. if(p==)
  62. {
  63. scanf("%d",&val);
  64. add(to,from,val);
  65. }
  66. if(p==)
  67. {
  68. scanf("%d",&val);
  69. add(from,to,-val);
  70. }
  71. if(p==)
  72. {
  73. add(to,from,);
  74. add(from,to,);
  75. }
  76. }
  77. for(rii=;i<=n;i++)
  78. {
  79. add(,i,);
  80. }
  81. bool kkk=spfa();
  82. if(kkk==true)
  83. {
  84. cout<<"Yes";
  85. }
  86. else
  87. {
  88. cout<<"No";
  89. }
  90.  
  91. }

小K的农场(差分约束,spfa)的更多相关文章

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

    首先第一篇讨论的是差分约束系统解的存在 差分约束系统是有 \(n\) 个变量及 \(m\) 个(如 \(x_{i} - x_{j} \leq a_{k}\) )关系组成的系统 差分约束解的求解可以转化 ...

  2. 【BZOJ3436】小K的农场 差分约束

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

  3. 小K的农场 差分约束

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

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

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3436 题解: 裸的差分约束: 1.a>=b+c  ->  b<=a-c ...

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

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

  6. 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...

  7. P1993 小K的农场 差分约束系统

    这个题是一道差分约束系统的裸题,什么是差分约束系统呢?就是给了一些大小条件,然后让你找一个满足的图.这时就要用差分约束了. 怎么做呢?其实很简单,就是直接建图就好,但是要把所有条件变为小于等于号,假如 ...

  8. 【BZOJ3436】小K的农场(差分约束)

    [BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...

  9. BZOJ_3436_小K的农场_差分约束

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

  10. [bzoj3436]小K的农场_差分约束

    小K的农场 bzoj-3436 题目大意:给定n个点,每个节点有一个未知权值.现在有m个限制条件,形如:点i比点j至少大c,点i比点j至多大c或点i和点j相等.问是否可以通过给所有点赋值满足所有限制条 ...

随机推荐

  1. 理解JS表达式

    表达式:是由运算元和运算符(可选)构成,并产生运算结果的语法结构. 基本表达式 以下在ES5中被称为基本表达式(Primary Expression) this.null.arguments等内置的关 ...

  2. System.Net.Mail 邮件发送示例

    前言:OA自动发送邮件的程序不好使,SQL Server 存储过程邮件发送程序好使,但是不利于标准化和维护,于是觉得是适合找些“轮子”武装一下.想起之前学习过System.Net.Mail ,于是再次 ...

  3. 八、word-space与letter-space

    1.worde-space是增加或减少单词之间的空白,即字间距.例如: this     is      a     bag   2.letter-space是增加或减少字符间的空白,即字符间距.例如 ...

  4. Scrum----学习心得

    Scrum学习心得 什么是敏捷开发? 敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的 开发方法.它不是一门技术,它是一种开发方法,也就是一种软件开发的流程,它会指导我 ...

  5. Java基础之多线程详细分析

    在了解多线程之前,先来了解一下进程与线程之间的关系. 进程和线程: 进程是指在系统中正在执行的一个程序,每个进程之间是独立的. 线程是进程的一个基本执行单元.一个进程要想执行任务,必须得有线程(每1个 ...

  6. sqlserver中循环生成记录

    declare @i int set @i=1 while(@i<=10) begin INSERT INTO [BMData].[dbo].[QueryBlackListLogs] ([ID] ...

  7. Linux 虚拟机的计划维护

    Azure 定期执行更新,以提高虚拟机的主机基础结构的可靠性.性能及安全性. 此类更新包括修补宿主环境(例如操作系统.虚拟机监控程序以及主机上部署的各种代理)中的软件组件.升级网络组件以及硬件解除授权 ...

  8. 实验5&期中考试后两题

    实验内容1: #include <iostream> #include <vector> #include <string> using namespace std ...

  9. C语言编译器,写给萌新们看看。

    就我已经经历过的大学课程,仿佛每一门计算机的专业课程的开头,都是在介绍计算机发展的历史,和大名鼎鼎的冯诺依曼结构. 譬如C语言,比较水的计算机导论,c++,数据结构,计算机组成原理,甚至是Linux实 ...

  10. pg 关于不插入重复字段的方法

    首先在表的某列加入唯一约束 alter table language_pms add CONSTRAINT language_pms_unique unique(xml); insert into l ...