题目链接:

http://www.lydsy.com/JudgeOnline/problem.php?id=4500

题解:

从行向列建边,代表一个格子a[i][j],对每个顶点的所有操作可以合并在一起用sum[xi]表示,

那么题目相当于是要求sum[xi]+sum[xj]==a[xi][xj];

等价于:sum[xj]-(-sum[xi])==a[xi][xj]

等价于:sum[xj]-sum'[xi]<=a[xi][xj] && sum[xj]-sum'[xi]>=a[xi][xj]

等价于:sum[xj]<=sum'[xi]+w && sum'[xi]<=sum[xj]+(-w)

所有就可以用差分约束来做了。跑一遍最短路,判一下负环就可以了。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<vector>
  5. #include<queue>
  6. using namespace std;
  7.  
  8. const int maxn = ;
  9. const int INF = 0x3f3f3f3f;
  10.  
  11. struct Edge {
  12. int v, w;
  13. Edge(int v, int w) :v(v), w(w) {}
  14. Edge() {}
  15. };
  16.  
  17. int n, m,k;
  18. vector<Edge> egs;
  19. vector<int> G[maxn];
  20.  
  21. void addEdge(int u, int v, int w) {
  22. G[u].push_back(egs.size());
  23. egs.push_back(Edge(v,w));
  24. }
  25.  
  26. bool inq[maxn];
  27. int cnt[maxn];
  28. int d[maxn];
  29. bool spfa() {
  30. memset(inq, , sizeof(inq));
  31. memset(cnt, , sizeof(cnt));
  32. for (int i = ; i <= n + m; i++) d[i] = INF;
  33. queue<int> Q;
  34. d[] = ; inq[] = true; Q.push();
  35. while (!Q.empty()) {
  36. int u = Q.front(); Q.pop();
  37. inq[u] = false;
  38. for (int i = ; i < G[u].size(); i++) {
  39. Edge& e = egs[G[u][i]];
  40. if (d[e.v] > d[u] + e.w) {
  41. d[e.v] = d[u] + e.w;
  42. if (!inq[e.v]) {
  43. Q.push(e.v);
  44. inq[e.v] = true;
  45. if (++cnt[e.v] > n+m+) {
  46. return false;
  47. }
  48. }
  49. }
  50. }
  51. }
  52. return true;
  53. }
  54.  
  55. void init() {
  56. for (int i = ; i <= n + m; i++) G[i].clear();
  57. egs.clear();
  58. }
  59.  
  60. int main() {
  61. int tc;
  62. scanf("%d", &tc);
  63. while (tc--) {
  64. scanf("%d%d%d", &n, &m, &k);
  65. init();
  66. for (int i = ; i < k; i++) {
  67. int u, v, w;
  68. scanf("%d%d%d", &u, &v, &w);
  69. addEdge(u, v+n, w);
  70. addEdge(v+n, u, -w);
  71. }
  72. for (int i = ; i <= n + m; i++) {
  73. addEdge(, i, );
  74. }
  75. if (spfa()) {
  76. puts("Yes");
  77. }
  78. else {
  79. puts("No");
  80. }
  81. }
  82. return ;
  83. }
  84.  
  85. /*
  86. 2
  87. 2 2 4
  88. 1 1 0
  89. 1 2 0
  90. 2 1 2
  91. 2 2 2
  92. 2 2 4
  93. 1 1 0
  94. 1 2 0
  95. 2 1 2
  96. 2 2 1
  97. */

BZOJ 4500: 矩阵 差分约束的更多相关文章

  1. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...

  2. bzoj 4500: 矩阵 差分约束系统

    题目: Description 有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作: 选择一行, 该行每个格子的权值加1或减1. 选择一列, 该列每个格子的权值加1或减1. 现在有K ...

  3. bzoj 4500: 矩阵【差分约束】

    (x,y,z)表示格子(x,y)的值为z,也就是x行+y列加的次数等于z,相当于差分约束的条件,用dfs判断冲突即可. #include<iostream> #include<cst ...

  4. 【BZOJ 4500 矩阵】

    Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 390  Solved: 217[Submit][Status][Discuss] Description ...

  5. BZOJ 4500: 矩阵

    4500: 矩阵 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 326  Solved: 182[Submit][Status][Discuss] De ...

  6. bzoj 4500 矩阵 题解

    题意: 有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作: 选择一行,该行每个格子的权值加1或减1. 选择一列,该列每个格子的权值加1或减1. 现在有 $ ...

  7. BZOJ 2330 糖果 差分约束求最小值

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2330 题目大意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果 ...

  8. BZOJ 4500: 矩阵 带权并查集

    这个思路挺巧妙的 ~ 定义一行/列的权值为操作后所整体增加的值. 那么,我们会有若干个 $a[x]+b[y]=c$ 的限制条件. 但是呢,我们发现符号是不能限制我们的(因为可加可减) 所以可以将限制条 ...

  9. 【BZOJ4500】矩阵(差分约束)

    [BZOJ4500]矩阵(差分约束) 题面 BZOJ 然而权限题 题解 显然拆分行和列.不妨设这一行/列总共加减的值是\(p\),那么每一个限制就是两个数的和为一个特定的数.这样子不好做,反正是一个二 ...

随机推荐

  1. C#读取xlsx文件Excel2007

    读取Excel 2007的xlsx文件和读取老的.xls文件是一样的,都是用Oledb读取,仅仅连接字符串不同而已. 具体代码实例: public static DataTable GetExcelT ...

  2. responseXML 属性

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs ...

  3. 转载字典地址:http://blog.csdn.net/aladdinty/article/details/3591789

    相关文章: http://www.360doc.com/content/13/1003/23/14070959_318861279.shtml http://www.360doc.com/conten ...

  4. IntelliJ IDEA 13破解(JRebel 5.6.3a破解)

    首先安装IntelliJ 13,记得要下载Ultimate Edition版本,不然就不需要破解了.. 安装到本地,然后进行一些配置(这一步可以不要,但是考虑到以后换系统可以省事,推荐做) 打开{in ...

  5. 5)Java部分常用package功能介绍

    1> java.lang    (package)   这个是系统的基础类,比如String等都是这里面的,这个package是唯一一个可以不用import就可以使用的Package 包中关键类 ...

  6. FireFox Prevent this page from creating addtional dialogs 火狐浏览器 设置 阻止此页面创建更多对话框

    FireFox英文版本老弹出“Prevent this page from creating addtional dialogs”的确认框 FireFox english version alert ...

  7. Oracle 分区表的统计信息实例

    ORACLE的统计信息在执行SQL的过程中扮演着非常重要的作用,而且ORACLE在表的各个层次都会有不同的统计信息,通过这些统计信息来描述表的,列的各种各样的统计信息.下面通过一个复合分区表来说明一些 ...

  8. spark 集合交集差集运算

    intersect except是spark提供的集合差集运算, 但是要求参与运算的两个dataframe,有相同的data Schema. 如果我想从 集合1(attribute1, attribu ...

  9. 比较C++中的4种类型转换方式

    C++的四种cast操作符的区别并非我的原创-------------------------------------------from:http://blog.csdn.net/hrbeuwhw/ ...

  10. python 序列化之JSON和pickle详解

    JSON模块 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类 ...