费用流,连下面几类边

1.s->s',流量为n*m,费用为0,表示最多可放置n*m个士兵

2.s'->行

(1)流量为a[i],费用为-n*m,表示必须在这一行放置a[i]个士兵。

(2)流量为n*m,费用为0,表示该行可以放置其他任意数目士兵。

3.行->列,流量为1,费用为1,表示第i行第j列放置的士兵数目

4.列->t

(1)流量为b[i],费用为-n*m,表示必须在这一列放置b[i]个士兵。

(2)流量为n*m,费用为0,表示该列可以放置其他任意数目士兵。

5.s'->t,流量为n*m,费用为0,表示一些士兵可以不用放置。

最后答案为费用+(Σa[i]+Σb[i])*n*m

代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<queue>
  4. #define mp make_pair
  5. #define pii pair<int,int>
  6. #define N 10010
  7. #define M 200010
  8. #define inf 0x37373737
  9. using namespace std;
  10. struct MCMF{
  11. int h[N] , dis[N] , ing[N] , pre[N] , s , t , n;
  12. int to[M] , ne[M] , cap[M] , cost[M] , e;
  13. void ini(){
  14. fill(h,h+N,-);
  15. e = ;
  16. }
  17. void liu(int u,int v,int c,int w){
  18. to[e] = v , ne[e] = h[u] , cap[e] = c , cost[e] = w;
  19. h[u] = e++;
  20. }
  21. void link(int u,int v,int c,int w){
  22. liu(u,v,c,w);
  23. liu(v,u,,-w);
  24. }
  25. bool spfa(){
  26. queue<int> Q;
  27. fill(ing,ing+n,);
  28. fill(pre,pre+n,-);
  29. fill(dis,dis+n,inf);
  30. ing[s] = true , dis[s] = ;
  31. Q.push(s);
  32. while(!Q.empty()){
  33. int c = Q.front();Q.pop();ing[c] = false;
  34. for(int k=h[c];~k;k=ne[k]){
  35. int v = to[k];
  36. if(cap[k] <= ) continue;
  37. if(dis[c] + cost[k] < dis[v]){
  38. dis[v] = dis[c] + cost[k];
  39. pre[v] = k;
  40. if(!ing[v]) Q.push(v) , ing[v] = true;
  41. }
  42. }
  43. }
  44. return dis[t] != inf;
  45. }
  46. int flow , mincost;
  47. pii run(int _s,int _t,int _n){
  48. s = _s , t = _t , n = _n;
  49. flow = mincost = ;
  50. while(spfa()){
  51. int pl = inf , p , k;
  52. for(p=t;p!=s;p=to[k^]){
  53. k = pre[p];
  54. pl = min(pl,cap[k]);
  55. }
  56. for(p=t;p!=s;p=to[k^]){
  57. k = pre[p];
  58. cap[k] -= pl;
  59. cap[k^] += pl;
  60. }
  61. mincost += pl * dis[t];
  62. flow += pl;
  63. }
  64. return mp(flow,mincost);
  65. }
  66. };
  67. MCMF t;
  68. int n,m,k,i,j,a[N],b[N],sum;
  69. int flag[][];
  70. int main()
  71. {
  72. scanf("%d%d%d",&n,&m,&k);
  73. for (i=;i<=n;i++)
  74. scanf("%d",&a[i]),sum+=a[i];
  75. for (i=;i<=m;i++)
  76. scanf("%d",&b[i]),sum+=b[i];
  77. for (i=;i<=k;i++)
  78. {
  79. int A,B;
  80. scanf("%d%d",&A,&B);
  81. flag[A][B]=;
  82. }
  83.  
  84. t.ini();
  85. t.link(,n+m+,n*m,);
  86. t.link(n+m+,n+m+,n*m,);
  87. for (i=;i<=n;i++)
  88. {
  89. t.link(n+m+,i,a[i],-n*m);
  90. t.link(n+m+,i,n*m,);
  91. }
  92. for (i=;i<=m;i++)
  93. {
  94. t.link(n+i,n+m+,b[i],-n*m);
  95. t.link(n+i,n+m+,n*m,);
  96. }
  97. for (i=;i<=n;i++)
  98. for (j=;j<=m;j++)
  99. if (flag[i][j]==)
  100. t.link(i,n+j,,);
  101.  
  102. int ans=t.run(,n+m+,n+m+).second;
  103. printf("%d\n",ans+sum*n*m);
  104. }

bzoj1458 士兵占领的更多相关文章

  1. BZOJ1458 士兵占领 网络流 最大流 SAP

    原文链接http://www.cnblogs.com/zhouzhendong/p/8384699.html 题目传送门 - BZOJ1458 题意概括 有一个M * N的棋盘,有的格子是障碍.现在你 ...

  2. BZOJ1458:士兵占领(有上下界最小流)

    Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...

  3. bzoj1458: 士兵占领(最大流)

    题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...

  4. BZOJ1458 士兵占领 【带上下界网络流】

    题目链接 BZOJ1458 题解 对行列分别建边,拆点,设置流量下限 然后\(S\)向行连边\(inf\),列向\(T\)连边\(inf\),行列之间如果没有障碍,就连边\(1\) 然后跑最小可行流即 ...

  5. bzoj1458: 士兵占领 网络流

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1458 也可以去luogu 思路 想成倒着删去点,使得依旧满足覆盖!! 左边横,右边列,之间用 ...

  6. bzoj1458士兵占领

    传送门 和上一题差不多,每行和每列分别看做一个点,障碍点坐标的行和列就不建边,再按照有源汇上下界建图就好了,唯一的区别就是这个题求的是最小流 这个题的数据好水呢,建错图也能A呢 #include< ...

  7. 【BZOJ1458】士兵占领 最小流

    [BZOJ1458]士兵占领 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占 ...

  8. 【BZOJ1458】【洛谷4311】士兵占领(网络流)

    [BZOJ1458][洛谷4311]士兵占领(网络流) 题面 BZOJ权限题,洛谷真好 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最 ...

  9. 【BZOJ-1458】士兵占领 最大流

    1458: 士兵占领 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 782  Solved: 456[Submit][Status][Discuss] ...

随机推荐

  1. ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信

    1.本文包括 1)在windows下使用ZMQ 2)在windows环境下与Linux环境下进行网络通信 2.在Linux下使用ZMQ 之前写过一篇如何在Linux环境下使用ZMQ的文章 <Ze ...

  2. linux下定时重启tomcat

    工具/原料 linux tomcat 方法/步骤 编写tomcat_shutdown.sh: #!/bin/sh export JAVA_HOME=/home/oracle/jdk1..0_67/ e ...

  3. Repaint轨迹保留?(待处理,待编辑)

    import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPane ...

  4. [CareerCup] 17.4 Maximum of Two Numbers 两数中的较大值

    17.4 Write a method which finds the maximum of two numbers. You should not use if-else or any other ...

  5. asp.net 中 UEditor 图片和附件上传失败的处理方法

    1.0 找到 net 文件夹下面的 web.config 配置文件,注释掉如下的两句: 2.0 Uploader文件默认属性为编译,将其属性改为内容以后重新运行程序,图片上传成功. 3.0 删除 im ...

  6. 导入excle数据将excle数据插入到数据库

    实现功能是,用户可以直接导入对应数据,或者用户下载模板,填写数据,导入模板数据.easyui实现 前台页面 { text : '日清导入', iconCls : 'icon-print', handl ...

  7. 使用Sublime Text 直接运行Quick-cocos2d-x 项目

    一.新建一个编译系统 { "cmd": "D:/WorkSoftWare/Quick/quick-cocos2d-x-3.3rc0/quick/samples/Runni ...

  8. select的5中子句where,group by, havaing, order by, limit的使用顺序及实例

    -- 语法: SELECT select_list FROM table_name [ WHERE search_condition ] [ GROUP BY group_by_expression ...

  9. 2145334赵文豪《Java程序设计》第2周学习总结

    2145334赵文豪<Java程序设计>第2周学习总结 教材学习内容总结 第二周的学习结束了,又是充实的一周,在这周的java学习过程中,我们主要学习了java的基础语法.其中包括类型变量 ...

  10. poj1061-青蛙的约会(扩展欧几里德算法)

    一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...