Description

背景
小K是个特么喜欢玩MC的孩纸。。。
描述
小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得
一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多
多种植了c个单位的作物,农场a与农场b种植的作物数一样多。但是,由于小K的记忆有些偏差,所以他想要知道存
不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。

Input

第一行包括两个整数n和m,分别表示农场数目和小K记忆中的信息的数目接下来m行:如果每行的第一个数是1,接
下来有三个整数a,b,c,表示农场a比农场b至少多种植了c个单位的作物如果每行第一个数是2,接下来有三个整数a
,b,c,表示农场a比农场b至多多种植了c个单位的作物如果每行第一个数是3,接下来有两个整数a,b,表示农场a
种植的数量与b一样。1<=n,m,a,b,c<=10000

Output

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

Sample Input

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

Sample Output

Yes
差分约束有一段时间没做了,又看了一遍,感觉比以前有了更好的认识。
接下来是证明:
然后,相等的情况,只需要连一条边,不然的话,相当于一个 0 的长度的环,又不能松弛,也不会死循环在里面,但是,在遍历邻接表的时候;
每次都做了无用的比较。

  1 /**************************************************************
  2     Problem: 3436
  3     User: TreeDream
  4     Language: C++
  5     Result: Accepted
  6     Time:140 ms
  7     Memory:2220 kb
  8 ****************************************************************/
  9
 10 #include <bits/stdc++.h>
 11
 12 using namespace std;
 13
 14 const int maxn = 10010;
 15
 16 struct Edge
 17 {
 18     int from,to,dist;
 19 };
 20
 21 inline int getint()
 22 {
 23     int w=0,q=0; char c=getchar();
 24     while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar();
 25     while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
 26 }
 27
 28 struct BellmanFord
 29 {
 30     int n,m;
 31     vector<Edge> edges;
 32     vector<int> G[maxn];
 33     bool inq[maxn];
 34     int d[maxn];
 35     int p[maxn];
 36     int cnt[maxn];
 37
 38     void init(int n)
 39     {
 40         this->n = n;
 41         for(int i=0; i<n; i++) G[i].clear();
 42         edges.clear();
 43     }
 44
 45     void AddEdge(int from,int to,int dist)
 46     {
 47         edges.push_back((Edge)
 48         {
 49             from,to,dist
 50         });
 51         m = edges.size();
 52         G[from].push_back(m-1);
 53     }
 54
 55     bool negativeCycle()
 56     {
 57         queue<int> Q;
 58         memset(inq,0,sizeof(inq));
 59         memset(cnt,0,sizeof(cnt));
 60         for(int i=0; i<n; i++)
 61         {
 62             d[i] = 0;
 63             inq[0] = true;
 64             Q.push(i);
 65         }
 66
 67         while(!Q.empty())
 68         {
 69             int u = Q.front();
 70             Q.pop();
 71             inq[u] = false;
 72             for(int i=0; i<G[u].size(); i++)
 73             {
 74                 Edge& e = edges[G[u][i]];
 75                 if(d[e.to]>d[u]+e.dist)
 76                 {
 77                     d[e.to] = d[u] + e.dist;
 78                     p[e.to] = G[u][i];
 79                     if(!inq[e.to]) {
 80                         Q.push(e.to);
 81                         inq[e.to] = true;
 82                         if(++cnt[e.to]>n)
 83                             return true;
 84                     }
 85                 }
 86             }
 87         }
 88         return false;
 89     }
 90
 91 };
 92
 93 BellmanFord sol;
 94
 95 int main()
 96 {
 97     int n,m;
 98     n = getint();
 99     m = getint();
100
101     sol.init(n+1);
102     int a,b,c;
103     int flag;
104     while(m--)
105     {
106         flag = getint();
107         //scanf("%d",&flag);
108         if(flag==2)
109         {
110             a = getint();
111             b = getint();
112             c = getint();
113             //scanf("%d%d%d",&a,&b,&c);
114             sol.AddEdge(b,a,c);
115         }
116         else if(flag==1)
117         {
118             a = getint();
119             b = getint();
120             c = getint();
121             //scanf("%d%d%d",&a,&b,&c);
122             sol.AddEdge(a,b,-c);
123         }
124         else if(flag==3)
125         {
126             a = getint();
127             b = getint();
128             //scanf("%d%d",&a,&b);
129             sol.AddEdge(a,b,0);
130             //sol.AddEdge(b,a,0);
131         }
132     }
133     for(int i=0; i<n; i++)
134         sol.AddEdge(0,i,0);
135
136     if(sol.negativeCycle())
137     {
138         puts("No");
139     }
140     else puts("Yes");
141
142     return 0;
143 }

View Code

转载于:https://www.cnblogs.com/TreeDream/p/6576816.html

BZOJ 3436 小K的农场 差分约束相关推荐

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

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

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

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

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

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

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

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

  5. bzoj3436小K的农场

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

  6. bzoj 3437 小p的农场

    bzoj 3437 小p的农场 思路 \(f[i]=min(f[j]+\sum\limits_{k=j+1}^{i}{b[k]*(i-k)}+a[i])\) \(f[i]=min(f[j]+\sum\ ...

  7. P1993 小 K 的农场

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

  8. 【BZOJ - 3436】小K的农场(差分约束)

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

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

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

最新文章

  1. 理解NSAttributedString
  2. tableau的2020.3在mac上可以使用,2020.4不行:亲测有效
  3. org.junit.runners.model.InvalidTestClassError: Invalid test class ‘‘: 1. No runnable methods
  4. python时间计算_python计算两日期之间工作日时长
  5. opencv10-形态学操作
  6. python守护线程
  7. JSF学习笔记--JSF简介,JSF第一个应用程序
  8. 对话Pauly Comtois:赫斯特商业媒体中的企业DevOps采用
  9. 二十六. Python基础(26)--类的内置特殊属性和方法
  10. bigdecimal 科学计数转普通计数_LoaRunner性能测试教程:Windows计数器(2)
  11. day_log 12月份的
  12. 【新手速成】菜鸟如何在三天内完成系统开发
  13. GB28181协议常见几种信令流程(三)
  14. 『伪原创工具 』英文在线伪原创工具
  15. OKR案例: 回顾/复盘会流程模板
  16. GSMA在G20峰会召开之前就妇女数字融合提出综合性议程
  17. 服务器系统访问量统计,通过网站统计或系统监视器查看IIS并发连接数
  18. centos7的scp命令_Linux命令-CentOS7安装scp命令,进行mac与Linux之间的文件上传下载...
  19. 穿普拉达的女王 观后感
  20. 计算机功能清单,如何使用印象笔记的清单功能?清单快速上手教程

热门文章

  1. foreach 语句
  2. 用Windows Live Writer发布博客也可以不生成缩略图
  3. Adobe与Facebook联手推出Flash开发工具
  4. 机器人雅可比矩阵的求法_构造法
  5. Linux驱动之平台设备
  6. javaweb 中的过滤器 包装器
  7. checkbox的常见问题
  8. ISP_MPLS *** 理论笔记
  9. phpwind自定义推送模块
  10. 利用JDK工具进行系统性能监测