【BZOJ3894】文理分科(最小割)

题面

BZOJ

Description

文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠

结过)

小P所在的班级要进行文理分科。他的班级可以用一个n*m的矩阵进行

描述,每个格子代表一个同学的座位。每位同学必须从文科和理科中选择

一科。同学们在选择科目的时候会获得一个满意值。满意值按如下的方式

得到:

1.如果第i行第秒J的同学选择了文科,则他将获得art[i][j]的满意值,如

果选择理科,将得到science[i][j]的满意值。

2.如果第i行第J列的同学选择了文科,并且他相邻(两个格子相邻当且

仅当它们拥有一条相同的边)的同学全部选择了文科,则他会更开

心,所以会增加same_art[i][j]的满意值。

3.如果第i行第j列的同学选择了理科,并且他相邻的同学全部选择了理

科,则增加same_science[i]j[]的满意值。

小P想知道,大家应该如何选择,才能使所有人的满意值之和最大。请

告诉他这个最大值。

Input

第一行为两个正整数:n,m

接下来n术m个整数,表示art[i][j];

接下来n术m个整数.表示science[i][j];

接下来n术m个整数,表示same_art[i][j];

Output

输出为一个整数,表示最大的满意值之和

Sample Input

3 4

13 2 4 13

7 13 8 12

18 17 0 5

8 13 15 4

11 3 8 11

11 18 6 5

1 2 3 4

4 2 3 2

3 1 0 4

3 2 3 2

0 2 2 1

0 2 4 4

Sample Output

152

题解

最小割傻逼题

先假设所有的贡献都能够那道

然后考虑最小割,源点汇点分别表示文理科

再额外建设新点,表示如果同一个集合内都在一侧则可以拿到额外贡献。

新点分别向源点汇点连边,向所有集合内的点连\(INF\)的边

然后求最小割即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. #define MAX 33333
  15. #define INF 2147483647
  16. inline int read()
  17. {
  18. RG int x=0,t=1;RG char ch=getchar();
  19. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  20. if(ch=='-')t=-1,ch=getchar();
  21. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  22. return x*t;
  23. }
  24. int d[4][2]={1,0,0,1,-1,0,0,-1};
  25. struct Line{int v,next,w;}e[333333];
  26. int h[MAX],cnt=2;
  27. inline void Add(int u,int v,int w)
  28. {
  29. e[cnt]=(Line){v,h[u],w};h[u]=cnt++;
  30. e[cnt]=(Line){u,h[v],0};h[v]=cnt++;
  31. }
  32. int level[MAX],S,T;
  33. bool bfs()
  34. {
  35. memset(level,0,sizeof(level));level[S]=1;
  36. queue<int> Q;Q.push(S);
  37. while(!Q.empty())
  38. {
  39. int u=Q.front();Q.pop();
  40. for(int i=h[u];i;i=e[i].next)
  41. if(e[i].w&&!level[e[i].v])
  42. level[e[i].v]=level[u]+1,Q.push(e[i].v);
  43. }
  44. return level[T];
  45. }
  46. int dfs(int u,int flow)
  47. {
  48. if(u==T||!flow)return flow;
  49. int ret=0;
  50. for(int i=h[u];i;i=e[i].next)
  51. if(e[i].w&&level[e[i].v]==level[u]+1)
  52. {
  53. int d=dfs(e[i].v,min(flow,e[i].w));
  54. ret+=d;flow-=d;
  55. e[i].w-=d;e[i^1].w+=d;
  56. }
  57. if(!ret)level[u]=0;
  58. return ret;
  59. }
  60. int Dinic()
  61. {
  62. int ret=0;
  63. while(bfs())ret+=dfs(S,INF);
  64. return ret;
  65. }
  66. int ans,n,m,bh[111][111],tot;
  67. int main()
  68. {
  69. n=read();m=read();
  70. for(int i=1;i<=n;++i)
  71. for(int j=1;j<=m;++j)
  72. bh[i][j]=++tot;
  73. S=0;T=tot+tot+tot+1;
  74. for(int i=1,x;i<=n;++i)
  75. for(int j=1;j<=m;++j)
  76. x=read(),Add(S,bh[i][j],x),ans+=x;
  77. for(int i=1,x;i<=n;++i)
  78. for(int j=1;j<=m;++j)
  79. x=read(),Add(bh[i][j],T,x),ans+=x;
  80. int now=tot;
  81. for(int i=1,x;i<=n;++i)
  82. for(int j=1;j<=m;++j)
  83. {
  84. x=read(),ans+=x,++now;
  85. Add(now,bh[i][j],INF);
  86. for(int k=0;k<4;++k)
  87. {
  88. int xx=i+d[k][0],yy=j+d[k][1];
  89. if(!xx||!yy||xx>n||yy>m)continue;
  90. Add(now,bh[xx][yy],INF);
  91. }
  92. Add(S,now,x);
  93. }
  94. for(int i=1,x;i<=n;++i)
  95. for(int j=1;j<=m;++j)
  96. {
  97. x=read(),ans+=x,++now;
  98. Add(bh[i][j],now,INF);
  99. for(int k=0;k<4;++k)
  100. {
  101. int xx=i+d[k][0],yy=j+d[k][1];
  102. if(!xx||!yy||xx>n||yy>m)continue;
  103. Add(bh[xx][yy],now,INF);
  104. }
  105. Add(now,T,x);
  106. }
  107. printf("%d\n",ans-Dinic());
  108. return 0;
  109. }

【BZOJ3894】文理分科(最小割)的更多相关文章

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

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

  2. [BZOJ3894]文理分科(最小割)

    (1) 对每个位置建一个点F1,S向这个点连art[i][j]的边,这个点向T连science[i][j]的边. (2) 对每个位置再建一个点F2,S向这个点连same_art[i][j]的边,这个点 ...

  3. 【BZOJ3894】文理分科 最小割

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

  4. 【BZOJ3894】【Luogu3358】文理分科 - 最小割多选一模型

    链接Click Here 这个题就是个板子的最小割多选一模型啦\(QwQ\),这里介绍一种通用的解法. 抛开组合收益不谈,这个题就是一个简单的最小割模型.我们只需要建出来这样一张图,在上面跑最小割,割 ...

  5. P4313 文理分科 最小割

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

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

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

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

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

  8. BZOJ3894/LuoguP4313 文理分科 (最小割)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  9. [bzoj3894]文理分科_网络流_最小割

    文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...

  10. [Bzoj3894]文理分科(最小割)

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

随机推荐

  1. 原生与JS交互 iOS

      前言 Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势” ...

  2. R小问题

    步骤 > library(xlsx) > test<-read.csv("I:/山农大学大数据中心/柱状图/z7.csv") > data1=test[] ...

  3. python环境通过selenium实现自动化web登陆及终端邀请

    自动化主要的就是识别对象,可以在网上搜到各种各样的方法,自行百度.下面仅附上一个简单的例子. 环境搭建参考如下链接: https://www.cnblogs.com/hepeilinnow/p/101 ...

  4. Linux查看文件内容

    查看文件内容的命令: cat:连接文件并且打印在标准输出 tac:连接并且倒序打印文件 more:屏幕文件熟读过滤器 less head:输出文件的第一部分 tail:输出文件最后的部分 nl:输出文 ...

  5. Python中的内建函数(Built_in Funtions)

    前言 在Python官方文档的标准库章节中,第一节是简介,第二节就是Built_in Functions,可见内建函数是Python标准库的重要组成部分,而有很多内建函数我们平时却很少用到或根本就不知 ...

  6. 该用哪个:Redis与Memcached之间如何选择呢?

    华为云分布式缓存Redis5.0和Memcached都是华为云DCS的核心产品. 那么在不同的使用场景之下,如何选择Redis5.0和Memcached呢? 就由小编为大家进行详细的数据对比分析吧 R ...

  7. 使用 Sublime Text 做 Javascript 编辑器 - 集成 JSHint 问题检测工具

    JSHint(jshint.com)是 Javascritp 代码质量工具,可以帮助开发人员发现 Javascript 代码中的错误和潜在的问题.jshint.com 是一个在线编辑器,我们可以为 S ...

  8. Centos 7 zabbix 实战应用

    实际需求:公司已经有了100台服务器,现在需要使用zabbix全部监控起来. 先出个方案(规划) 常规监控:cpu,内存,磁盘,网卡 问题:怎样快速添加100台机器         方法1:使用克隆的 ...

  9. [leetcode-908-Smallest Range I]

    Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and ...

  10. 基于spec探路者团队贪吃蛇作品的评论

    1 运动功能 由以上两图贪吃蛇的位置不同可知,运动功能实现.并且我能够通过使用键盘上的上下左右方位键控制蛇的移动方向,蛇在控制的方向上进行直线前进. 2 吃食物功能 以上两图可知吃食物功能实现.当界面 ...