题目大意

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

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

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

差分约束

要处理一组类似$x_{i1}+k_i\geq x_{i2}$的形式的偏序关系,我们发现图上每条边e连接的两个结点的单源最短路径长度都满足u[e]+w[e]>=v[e](u可能在v的最短路径上,也可能不在)。所以我们将图上的结点$x_{i1}, x_{i2}$连一条长度为$k_i$的边,将原点与所有边相连,跑一下最短路,那么每个结点的dist就是其所对应$x$值的一个解。

无解当且仅当图中有负环,判断负环的方法可以为:在SPFA时,判断每个结点的最短路径所经过的结点的数量是否超过TotNode,超过了则说明有负环。

题解说明

使用STL里的queue维护Node*,在BZOJ上可以AC,在洛谷上由于评测机64位指针8子节导致RE;queue改为维护int原先RE变为TLE,开O2后AC,不开O2即使手写queue也没有卵用。据说有用Dfs实现的SPFA,但是我不会。

  1. // luogu-judger-enable-o2
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7.  
  8. const int MAX_NODE = 10010, MAX_EDGE = MAX_NODE * 3, INF = 0x3f3f3f3f;
  9.  
  10. struct Node;
  11. struct Edge;
  12.  
  13. struct Node
  14. {
  15. Edge *Head;
  16. int Dist, FromEdgeCnt;
  17. bool Inq;
  18. }_nodes[MAX_NODE];
  19. int _vCount;
  20.  
  21. struct Edge
  22. {
  23. Node *To;
  24. Edge *Next;
  25. int Weight;
  26. }_edges[MAX_EDGE];
  27. int _eCount;
  28.  
  29. void AddEdge(int uId, int vId, int w)
  30. {
  31. Node *u = _nodes + uId, *v = _nodes + vId;
  32. Edge *e = _edges + ++_eCount;
  33. e->Weight = w;
  34. e->To = v;
  35. e->Next = u->Head;
  36. u->Head = e;
  37. }
  38.  
  39. bool SPFA(Node *start)
  40. {
  41. for (int i = 1; i <= _vCount; i++)
  42. _nodes[i].Dist = INF;
  43. start->Dist = 0;
  44. start->FromEdgeCnt = 0;
  45. start->Inq = true;
  46. static queue<int> q;
  47. q.push(start - _nodes);
  48. while (!q.empty())
  49. {
  50. int curId = q.front();
  51. q.pop();
  52. Node *cur = _nodes + curId;
  53. cur->Inq = false;
  54. if (cur->FromEdgeCnt > _vCount)
  55. return false;
  56. for (Edge *e = cur->Head; e; e = e->Next)
  57. {
  58. if (cur->Dist + e->Weight < e->To->Dist)
  59. {
  60. e->To->Dist = cur->Dist + e->Weight;
  61. e->To->FromEdgeCnt = cur->FromEdgeCnt + 1;
  62. if (!e->To->Inq)
  63. {
  64. e->To->Inq = true;
  65. q.push(e->To - _nodes);
  66. }
  67. }
  68. }
  69. }
  70. return true;
  71. }
  72.  
  73. int main()
  74. {
  75. int qCnt;
  76. _eCount = 0;
  77. scanf("%d%d", &_vCount, &qCnt);
  78. _vCount++;
  79. for (int i = 1; i <= qCnt; i++)
  80. {
  81. int op, a, b, c;
  82. scanf("%d", &op);
  83. switch (op)
  84. {
  85. case 1:
  86. scanf("%d%d%d", &a, &b, &c);
  87. AddEdge(a, b, -c);
  88. break;
  89. case 2:
  90. scanf("%d%d%d", &a, &b, &c);
  91. AddEdge(b, a, c);
  92. break;
  93. case 3:
  94. scanf("%d%d", &a, &b);
  95. AddEdge(a, b, 0);
  96. AddEdge(b, a, 0);
  97. break;
  98. }
  99. }
  100. for (int i = 1; i <= _vCount - 1; i++)
  101. AddEdge(_vCount, i, 0);
  102. if (SPFA(_nodes + _vCount))
  103. printf("Yes\n");
  104. else
  105. printf("No\n");
  106. return 0;
  107. }

  

luogu1993 小K的农场的更多相关文章

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

    \(if \ a - b <= c, AddEdge(b, a, c)\) Be careful, MLE is not good. #include <cstdio> #inclu ...

  2. 【BZOJ】3436: 小K的农场

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 938  Solved: 417[Submit][Status][Discuss ...

  3. 2014.7.7 模拟赛【小K的农场】

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

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

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

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

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

  6. P1993 小K的农场

    P1993 小K的农场比较裸的差分约束,只是我判负环的时候sb了... 有负环意味着无解 #include<iostream> #include<cstdio> #includ ...

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

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

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

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

  9. BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2111  Solved: 986[Submit][Status][Discus ...

随机推荐

  1. Laravel 5.4.36 session 发现

    由于Laravel session机制完全脱离了PHP自带的session机制  因此对于php.ini 配置session对Laravel  是不会产生影响 代码路径:   vendor/larav ...

  2. [ SCOI 2005 ] 最大子矩阵

    \(\\\) \(Description\) 给出一个\(N\times M\)的有权矩阵,选出其中\(K\)个互不重叠的子矩阵,使得这\(K\)个子矩阵的权值和最大. \(N\in [1,100]\ ...

  3. JS——冒泡排序

    核心思想: 1.外层for循环控制比较的轮数 2.内层for循环控制每轮比较的次数 3.外层每进行一轮比较,内层就少一次比较,因为外层每进行一轮比较都会产生一个最大值 <script> v ...

  4. JS——null

    变量被赋值为null,目的往往是为了销毁这个对象: var n1 = 1; n1 = null;

  5. [Windows Server 2008] Ecshop安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:ECSHO ...

  6. 【译】x86程序员手册20-6.3.4门描述符守卫程序入口

    6.3.4 Gate Descriptors Guard Procedure Entry Points 门描述符守卫程序入口 To provide protection for control tra ...

  7. 使用TFS創建團隊項目

    使用微軟賬號登錄Team Service,關聯一個TS賬戶,用來存放你所有的項目,可以從瀏覽器中直接訪問,地址類似yourname.visualstudio.com. 詳細鏈接 在TS賬戶主面板中,可 ...

  8. js 判断 微信浏览器

    <script type="text/javascript"> window.onload = function() { isWeixinBrowser(); } // ...

  9. zoom,zoom与haslayout的关系,zoom与transform: scale( )的区别

    1.zoom:(缩放)

  10. tab切换案例

    做个简单的tab切换效果,分别于jquery和js操作 (1)jQuery操作 先看下效果: <!DOCTYPE html> <html lang="en"> ...