思路

遇到这种利益冲突的最终利益最大化问题

考虑转化为最小割,使得损失的价值最小

相当于文科是S,理科是T,选出最小割就是确定损失代价最小的方案

然后就把S向每个点连一条cap=art[i][j]的边,每个点向T连一条cap=science[i][j]的边,再新建n*m个点表示同选文科的利益,然后S向每个新建点连一条cap=same_art[i][j]的边,然后再从新建点向每个点和它的相邻点向连一条cap=INF的边,然后同选立刻的收益同理新建点再向T连边,相邻点同理的向新建点连边

再跑出最小割即可

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <vector>
  5. #include <queue>
  6. using namespace std;
  7. struct Edge{
  8. int u,v,cap,flow;
  9. };
  10. const int MAXN = 40100;
  11. const int INF = 0x3f3f3f3f;
  12. vector<Edge> edges;
  13. vector<int> G[MAXN];
  14. void addedge(int u,int v,int cap){
  15. edges.push_back((Edge){u,v,cap,0});
  16. edges.push_back((Edge){v,u,0,0});
  17. int cnt=edges.size();
  18. G[u].push_back(cnt-2);
  19. G[v].push_back(cnt-1);
  20. }
  21. int cur[MAXN],dep[MAXN],vis[MAXN],s,t;
  22. int dfs(int x,int a){
  23. if(x==t||a==0)
  24. return a;
  25. int f,flow=0;
  26. for(int &i=cur[x];i<G[x].size();i++){
  27. Edge &e = edges[G[x][i]];
  28. if(dep[e.v]==dep[x]+1&&(f=dfs(e.v,min(e.cap-e.flow,a)))>0){
  29. flow+=f;
  30. e.flow+=f;
  31. edges[G[x][i]^1].flow-=f;
  32. a-=f;
  33. if(!a)
  34. break;
  35. }
  36. }
  37. return flow;
  38. }
  39. queue<int> q;
  40. bool bfs(void){
  41. memset(vis,0,sizeof(vis));
  42. dep[s]=0;
  43. vis[s]=true;
  44. q.push(s);
  45. while(!q.empty()){
  46. int x=q.front();
  47. q.pop();
  48. for(int i=0;i<G[x].size();i++){
  49. Edge &e = edges[G[x][i]];
  50. if(e.cap>e.flow&&(!vis[e.v])){
  51. vis[e.v]=true;
  52. dep[e.v]=dep[x]+1;
  53. q.push(e.v);
  54. }
  55. }
  56. }
  57. return vis[t];
  58. }
  59. int dinic(void){
  60. int flow=0;
  61. while(bfs()){
  62. // printf("Not Re\n");
  63. memset(cur,0,sizeof(cur));
  64. flow+=dfs(s,INF);
  65. }
  66. return flow;
  67. }
  68. int n,m,same_wen[110][110],same_li[110][110],wen[110][110],li[110][110],sum=0;
  69. const int mx[] = {0,0,1,-1,0},my[] ={0,1,0,0,-1};
  70. int id(int x,int y,int idx=0){
  71. return (x-1)*m+y+idx*n*m;
  72. }
  73. int main(){
  74. scanf("%d %d",&n,&m);
  75. for(int i=1;i<=n;i++)
  76. for(int j=1;j<=m;j++){
  77. scanf("%d",&wen[i][j]);
  78. sum+=wen[i][j];
  79. }
  80. for(int i=1;i<=n;i++)
  81. for(int j=1;j<=m;j++){
  82. scanf("%d",&li[i][j]);
  83. sum+=li[i][j];
  84. }
  85. for(int i=1;i<=n;i++)
  86. for(int j=1;j<=m;j++){
  87. scanf("%d",&same_wen[i][j]);
  88. sum+=same_wen[i][j];
  89. }
  90. for(int i=1;i<=n;i++)
  91. for(int j=1;j<=m;j++){
  92. scanf("%d",&same_li[i][j]);
  93. sum+=same_li[i][j];
  94. }
  95. // printf("Not Re\n");
  96. s=MAXN-2;//wen
  97. t=MAXN-3;//li
  98. for(int i=1;i<=n;i++)
  99. for(int j=1;j<=m;j++){
  100. addedge(s,id(i,j),wen[i][j]);//wen
  101. addedge(id(i,j),t,li[i][j]);//li
  102. }
  103. for(int i=1;i<=n;i++)//shang
  104. for(int j=1;j<=m;j++){
  105. addedge(s,id(i,j,1),same_wen[i][j]);
  106. addedge(id(i,j,1),id(i,j),INF);
  107. if(i>1)
  108. addedge(id(i,j,1),id(i-1,j),INF);
  109. if(j>1)
  110. addedge(id(i,j,1),id(i,j-1),INF);
  111. if(i<n)
  112. addedge(id(i,j,1),id(i+1,j),INF);
  113. if(j<m)
  114. addedge(id(i,j,1),id(i,j+1),INF);
  115. }
  116. for(int i=1;i<=n;i++)//shang
  117. for(int j=1;j<=m;j++){
  118. addedge(id(i,j,2),t,same_li[i][j]);
  119. addedge(id(i,j),id(i,j,2),INF);
  120. if(i>1)
  121. addedge(id(i-1,j),id(i,j,2),INF);
  122. if(j>1)
  123. addedge(id(i,j-1),id(i,j,2),INF);
  124. if(i<n)
  125. addedge(id(i+1,j),id(i,j,2),INF);
  126. if(j<m)
  127. addedge(id(i,j+1),id(i,j,2),INF);
  128. }
  129. // printf("Not Re\n");
  130. printf("%d\n",sum-dinic());
  131. return 0;
  132. }

P4313 文理分科的更多相关文章

  1. P4313 文理分科 最小割

    $ \color{#0066ff}{ 题目描述 }$ 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...

  2. BZOJ 3894 Luogu P4313 文理分科 (最小割)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3894 (luogu) https://www.luogu.org/pro ...

  3. BZOJ 3894 / Luogu P4313 文理分科 (拆点最小割)

    题面 中文题面- BZOJ 传送门 Luogu 传送门 分析 这道题类似于BZOJ 3774 最优选择,然后这里有一篇博客写的很好- Today_Blue_Rainbow's Blog 应该看懂了吧- ...

  4. Luogu P4313 文理分科

    link 最小割 双倍经验 这道题运用了最小割最常用的一种用法:集合划分. 因为源汇最小割即就是将源汇划分到不同的集合,那么最简单的应用就是最小代价划分集合了. 本题中,题意是将 \(n\cdot m ...

  5. BZOJ 3894: 文理分科 [最小割]

    3894: 文理分科 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 674  Solved: 392[Submit][Status][Discuss] ...

  6. Bzoj3894 文理分科

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 667  Solved: 389 Description  文理分科是一件很纠结的事情!(虽然看到这个题 ...

  7. bzoj 3894: 文理分科

    Description  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位. ...

  8. BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割

    BZOJ_3894_文理分科_最小割 Description  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进 ...

  9. BZOJ3894文理分科——最小割

    题目描述  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...

随机推荐

  1. git server 配置

    因为后面要采用Git代替Subversion,花了点时间配置了Git服务端和客户端,像以前一样,仍然基于最新的Ubuntu11.10 server/desktop系统. 感谢这几篇文章的作者: htt ...

  2. html5-css选择器

    /*/**{color: red}p{color: green}#div1{background: blue;padding-top: 15px;}.kk{background: blue;borde ...

  3. C#之Action的实际应用例子

    public class DemoAction{ public Action action; public Action<int> action1; public Action<in ...

  4. Runtime单例模式类 -- 控制电脑关机

    package demo1; import java.io.IOException; public class RunTimeDemo { public static void main(String ...

  5. JAVA基础1---Object类解析

    1.Object简介 众所周知,Object类是Java所有类的万类之源,所有Java类都是继承之Object类,而默认就直接忽略了extends Object这段代码. 2.Object类的源码 话 ...

  6. LINUX安装REDIS集群

    linux安装单机版redis已经在另一篇文章说过了,下边来搞集群,环境是新浪云服务器: redis3.0以后开始支持集群. 前言:redis用什么做集群? 用一个叫redis-trib.rb的rub ...

  7. B/S开发介绍

    b/s 的优势: 1.开发成本低 2.管理维护简单 3.产品升级便利 4.对用户的培训费用低 5.用户使用方便,出现故障的概率小 b/s 的不足: 1.安全性不足 2.客户端不能随心变化,受浏览器限制

  8. MySQL实现排名并查询指定用户排名功能

    表结构: CREATE TABLE test.testsort ( id ) NOT NULL AUTO_INCREMENT, uid ) COMMENT '用户id', score , ) DEFA ...

  9. PHP 中文工具类,支持汉字转拼音、拼音分词、简繁互转

    ChineseUtil 下载地址:https://github.com/Yurunsoft/ChineseUtil 另外一个中文转拼音工具:https://github.com/overtrue/pi ...

  10. API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)

    前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay Çelik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作 ...