1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. #define P 55
  6. #define N 2050
  7. #define INF (1<<30)
  8.  
  9. using namespace std;
  10.  
  11. int n,m,S,T,ss,tt,cnt=,tot=;
  12. int head[N],d[N],p[N],qlc[P],qrc[P],qlr[P],qrr[P];
  13. int map[P][P],sc[P],sr[P],r[P],c[P],dis[N];
  14. int ans,tl;
  15. struct Edge{ int a,b,v,cost,next; }e[*N];
  16. void add(int a,int b,int v,int cost) {
  17. e[++cnt].a = a;
  18. e[cnt].b = b;
  19. e[cnt].v = v;
  20. e[cnt].cost = cost;
  21. e[cnt].next = head[a];
  22. head[a] = cnt;
  23. }
  24.  
  25. inline void add_Node(int a,int b,int vl,int vr,int cost) {
  26. //printf("Node %d %d %d %d\n",a,b,vl,vr);
  27. d[a] -= vl; d[b] += vl;
  28. add(a,b,vr-vl,cost); add(b,a,,-cost);
  29. }
  30. void paul() {
  31. ss = tot+; tt = tot+;
  32. for (int _=;_<=tot;_++) {
  33. if (d[_] < ) add(_,tt,-d[_],) , add(tt,_,,);
  34. if (d[_] > ) add(ss,_, d[_],) , add(_,ss,,);
  35. }
  36. }
  37.  
  38. #define cp e[i].v
  39. #define B e[i].b
  40.  
  41. bool SPFA() {
  42. bool flag = false;
  43. memset(p,,sizeof(p));
  44. memset(dis,0x3f3f3f3f,sizeof(dis));
  45. dis[ss] = ;
  46. queue<int> q; q.push(ss);
  47. while (!q.empty()) {
  48. int u = q.front(); q.pop();
  49. if (u == tt) flag = true;
  50. for (int i=head[u];i;i=e[i].next)
  51. if (cp > && dis[u] + e[i].cost < dis[B]) {
  52. dis[B] = dis[u] + e[i].cost;
  53. p[B] = i;
  54. q.push(B);
  55. }
  56. }
  57. return flag;
  58. }
  59.  
  60. void mcf() {
  61. int g = p[tt] , flow = INF;
  62. while (g) {
  63. flow = min(flow , e[g].v);
  64. g = p[ e[g].a ];
  65. }
  66. g = p[tt];
  67. while (g) {
  68. e[g ].v -= flow;
  69. e[g^].v += flow;
  70. ans += e[g].cost * flow;
  71. g = p[ e[g].a ];
  72. }
  73. tl += flow;
  74. }
  75.  
  76. void init() {
  77. memset(head,,sizeof(head));
  78. memset(e,,sizeof(e));
  79. memset(d,,sizeof(d));
  80.  
  81. //memset(qlr,0,sizeof(qlr));
  82. //memset(qrr,0,sizeof(qrr));
  83. //memset(qlc,0,sizeof(qlc));
  84. //memset(qrc,0,sizeof(qrc));
  85.  
  86. memset(sc,,sizeof(sc));
  87. memset(sr,,sizeof(sr));
  88. memset(c,,sizeof(c));
  89. memset(r,,sizeof(r));
  90. memset(map,,sizeof(map));
  91. cnt = ; tot = ;
  92. S = ++tot; T = ++tot; add_Node(T,S,,INF,);
  93. ans = tl = ;
  94. }
  95.  
  96. int main() {
  97. #ifndef ONLINE_JUDGE
  98. freopen("5.in","r",stdin);
  99. #endif
  100. while (~scanf("%d",&n)) {
  101. init();
  102. for (int i=;i<=n;i++) for (int j=;j<=n;j++) {
  103. scanf("%d",&map[i][j]);
  104. if (map[i][j]) sr[i]++ ,sc[j]++;
  105. }
  106. for (int i=;i<=n;i++) r[i] = ++tot , c[i] = ++tot;
  107. for (int i=;i<=n;i++) {
  108. scanf("%d%d",&qlr[i],&qrr[i]);
  109. add_Node(S,r[i],sr[i],sr[i],); //³¬¼¶Ô´ --> µÚiÐÐ
  110. add_Node(r[i],T,qlr[i],qrr[i],); //µÚiÐÐ --> ³¬¼¶»ã
  111. }
  112. for (int i=;i<=n;i++) {
  113. scanf("%d%d",&qlc[i],&qrc[i]);
  114. add_Node(S,c[i],sc[i],sc[i],); //³¬¼¶Ô´ --> µÚiÁÐ
  115. add_Node(c[i],T,qlc[i],qrc[i],); //µÚiÁÐ --> ³¬¼¶»ã
  116. }
  117. for (int i=;i<=n*n/;i++) {
  118. int x1,y1,x2,y2;
  119. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  120. if (map[x1][y1] == map[x2][y2]) continue;
  121. if (!map[x1][y1]) swap(x1,x2) , swap(y1,y2);
  122. if (x1 == x2) add_Node(c[y1],c[y2],,,); //Èç¹ûÔÚͬһÐÐ ¾ÍÔÚÁÐÖ®¼äÁ¬±ß
  123. if (y1 == y2) add_Node(r[x1],r[x2],,,); //Èç¹ûÔÚͬһÁÐ ¾ÍÔÚÐÐÖ®¼äÁ¬±ß
  124. }
  125. paul(); //²¹ÉÏËùÓвðµÄ±ß
  126.  
  127. //for (int i=2;i<=cnt;i+=2) if (e[i].v) printf("%d %d %d %d\n",e[i].a,e[i].b,e[i].v,e[i].cost);
  128.  
  129. while (SPFA())
  130. mcf();
  131. //for (int i=3;i<=cnt;i+=2) if (e[i].v) printf("%d %d %d\n",e[i].b,e[i].a,e[i].v);
  132.  
  133. for (int i=head[ss];i;i=e[i].next) if (e[i].v) ans = -;//ÅжÏÊÇ·ñÓнâ
  134. if (ans == -) puts("-1"); else printf("%d\n",ans);
  135. }
  136. return ;
  137. }

UvaL-7670 上下界可行费用流的更多相关文章

  1. 【UVALive - 5131】Chips Challenge(上下界循环费用流)

    Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...

  2. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

  3. BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流

    https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ...

  4. BZOJ 2055: 80人环游世界(有上下界的费用流)

    题面 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 693 Solved: 434 [Submit][Status][Discuss] Descript ...

  5. 【上下界网络流 费用流】bzoj2055: 80人环游世界

    EK费用流居然写错了…… Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个80人的团 ...

  6. Codeforces Gym 101190 NEERC 16 .D Delight for a Cat (上下界的费用流)

    ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ,因此一个小时内他只能选择睡觉或者打隔膜,当然他也必须选择睡觉或打隔膜,对于每一个小时,他选择睡 ...

  7. BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流

    题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...

  8. BZOJ 2055 80人环游世界 有上下界最小费用可行流

    题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家.    因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ...

  9. [BZOJ2055]80人环游世界 有上下界最小费用最大流

    2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MB Description     想必大家都看过成龙大哥的<80天环游世界>,里面 ...

随机推荐

  1. 修改deploy location

    在MyEclipse,如果某Web Project重命名后,项目名称有可能仍然是之前的名称. 修改路径: 第一, 路径:右击某Web Project,Properties->MyEclipse- ...

  2. C基础知识(10):预处理器

    C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理. 所有的预处理器命令都是以井号(#)开 ...

  3. String与toString

    String与toString能将对象转为字符串: 类型 行为描述 Array 将 Array 的每个元素转换为字符串,并将它们依次连接起来,两个元素之间用英文逗号作为分隔符进行拼接. Boolean ...

  4. java8:(Lambda 表达式,Supplier,@FunctionalInterface,foreach(),Optional,Stream().collect,双冒号,joining,partitioningBy分区,collectingAndThen,filter())

    1.Lambda 表达式: 引导:http://www.cnblogs.com/yulinfeng/p/8452379.html DEMO1: List<String> names1 = ...

  5. 【HANA系列】SAP HANA SQL获取某字符串的位置

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL获取某字 ...

  6. tyan 3+1+15 远程

    直接修改好BIOS,输入IP即可访问,帐号anonymous 这个登录 也就是为空,直接写入密码,登录即可

  7. jenkins自动化部署springboot

    一.linux按jar包名称部署 1.执行shell PID=$(ps -ef | grep app.jar | grep -v grep | awk '{ print $2 }') if [ -z ...

  8. node.js中的url.parse方法使用说明

    node.js中的url.parse方法使用说明:https://blog.csdn.net/swimming_in_it_/article/details/77439975 版权声明:本文为博主原创 ...

  9. C++多线程基础学习笔记(一)

    下面分三个方面多线程技术的必须掌握一些基本知识. 1.进程 2.线程 3.并发 (1)进程 一个可执行程序运行起来了,即为创建了一个进程.如在电脑上打开了word,就创建了一个word进程,打开QQ, ...

  10. python 操作mongodb 文件相关

    https://api.mongodb.com/python/current/tutorial.html# 文档地址 from pymongo import MongoClientfrom gridf ...