luoguP4313 文理分科

复习完之后做了道典型题目。

这道题条件有点多

我们逐个分析

如果没有\(sameart\)或者\(samescience\)的限制,就是一个裸的最大权闭合子图的问题了

但是再考虑有的话(其实还是一个最大权闭合子图)

很明显我们还是可以按照套路分成两个集合.

然后先按照权值分别划分\(S\),\(T\)集合

然后再向他要求的学生连一条\(\infty\)

放一张奇丑无比的图

感性理解一下就好了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<cctype>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std;
  8. const int N = 2e5 + 3;
  9. const int M = 2e6 + 3;
  10. const int INF = 2e9;
  11. int cur[N],head[N],high[N];
  12. struct edge{
  13. int to;
  14. int nxt;
  15. int flow;
  16. }e[M];
  17. int n,m,tot = 1,s,t;
  18. int ans = 0;
  19. int dx[5] = {0,1,-1,0,0},dy[5] = {0,0,0,1,-1};
  20. inline void add(int x,int y,int z){
  21. e[++tot].to = y;
  22. e[tot].flow = z;
  23. e[tot].nxt = head[x];
  24. head[x] = tot;
  25. if(z < INF) ans += z;
  26. }
  27. inline int read(){
  28. int v = 0,c = 1;char ch = getchar();
  29. while(!isdigit(ch)){
  30. if(ch == '-') c = -1;
  31. ch = getchar();
  32. }
  33. while(isdigit(ch)){
  34. v = v * 10 + ch - 48;
  35. ch = getchar();
  36. }
  37. return v * c;
  38. }
  39. inline bool bfs(){
  40. queue <int> q;
  41. for(int i = 0;i <= t;++i) high[i] = 0;
  42. q.push(s);high[s] = 1;
  43. while(!q.empty()){
  44. int k = q.front();q.pop();
  45. for(int i = head[k];i;i = e[i].nxt){
  46. int y = e[i].to;
  47. if(!high[y] && e[i].flow > 0)
  48. q.push(y),high[y] = high[k] + 1;
  49. }
  50. }
  51. return high[t] != 0;
  52. }
  53. inline int dfs(int x,int dis){
  54. if(x == t) return dis;
  55. for(int &i = cur[x];i;i = e[i].nxt){
  56. int y = e[i].to;
  57. if(high[y] == high[x] + 1 && e[i].flow > 0){
  58. int flow = dfs(y,min(dis,e[i].flow));
  59. if(flow > 0){
  60. e[i].flow -= flow;
  61. e[i ^ 1].flow += flow;
  62. return flow;
  63. }
  64. }
  65. }
  66. return 0;
  67. }
  68. inline int dinic(){
  69. int res = 0;
  70. while(bfs()){
  71. for(int i = 0;i <= t;++i) cur[i] = head[i];
  72. while(int now = dfs(s,INF)) res += now;
  73. }
  74. return res;
  75. }
  76. int main(){
  77. n = read(),m = read();
  78. s = 3 * n * m + 1,t = s + 1;
  79. for(int i = 0;i < n;++i)
  80. for(int j = 0;j < m;++j){
  81. int x = read();
  82. add(s,i * m + j,x);
  83. add(i * m + j,s,0);
  84. }
  85. for(int i = 0;i < n;++i)
  86. for(int j = 0;j < m;++j){
  87. int x = read();
  88. add(i * m + j,t,x);
  89. add(t,i * m + j,0);
  90. }
  91. for(int i = 0;i < n;++i)
  92. for(int j = 0;j < m;++j){
  93. int x = i * m + j + n * m,y = x + n * m;
  94. for(int k = 0;k < 5;++k){
  95. int xx = i + dx[k],yy = j + dy[k];
  96. if(xx < 0 || xx >= n || yy < 0 || yy >= m) continue;
  97. add(x,xx * m + yy,INF);add(xx * m + yy,x,0);
  98. add(xx * m + yy,y,INF);add(y,xx * m + yy,0);
  99. // add(x,xx * n + yy,0);add(xx * n + yy,x,INF);
  100. // add(xx * n + yy,y,0);add(y,xx * n + yy,INF);
  101. }
  102. }
  103. for(int i = 0;i < n;++i)
  104. for(int j = 0;j < m;++j){
  105. int x = read();
  106. add(s,i * m + j + n * m,x);
  107. add(i * m + j + n * m,s,0);
  108. }
  109. for(int i = 0;i < n;++i)
  110. for(int j = 0;j < m;++j){
  111. int x = read();
  112. add(i * m + j + 2 * n * m,t,x);
  113. add(t,i * m + j + 2 * n * m,0);
  114. }
  115. // cout << ans << endl;
  116. ans -= dinic();
  117. printf("%d\n",ans);
  118. return 0;
  119. }

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

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

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

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

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

  3. Bzoj3894 文理分科

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

  4. bzoj 3894: 文理分科

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

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

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

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

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

  7. 【BZOJ3894】文理分科

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

  8. 文理分科 BZOJ3894 & happiness BZOJ2127

    分析: 最小割(一开始我没看出来...后来经过提点,大致理解...),不选则割的思想. 我们先这样考虑,将和选理相关的和S相连,与选文相关的和T相连,如果没有第二问,那么建图就是简单的S连cnt,cn ...

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

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

随机推荐

  1. 使用Velero Restic快速完成云原生应用迁移至ACK集群

    本文记录使用Velero Restic快速完成云原生应用迁移至ACK集群的实践过程. 0. 实践步骤概览 (1)创建GKE集群(或自建Kubernetes集群)(2)在GKE集群上部署示例应用Jenk ...

  2. json 2016-09-18 22:03 207人阅读 评论(18) 收藏

    JSON:JavaScript 对象表示法(JavaScript Object Notation) JSON是什么? JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  3. LeetCode108 Convert Sorted Array to Binary Search Tree

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. (M ...

  4. poj 1655 Balancing Act 求树的重心【树形dp】

    poj 1655 Balancing Act 题意:求树的重心且编号数最小 一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少. (图片来源: PatrickZhou 感谢博主) 看上面的图就好 ...

  5. Android实现圆角边框

    http://www.cnblogs.com/flyme/archive/2012/06/20/2556259.html android shape的使用 http://www.cnblogs.com ...

  6. 修改oracle编码格式

    文章参照:https://www.jb51.net/article/53078.htm 1.查看oracle当前编码格式: SELECT * FROM V$NLS_PARAMETERS WHERE P ...

  7. XML之DOM解析文档 Day24

    TestDom.java package com.sxt.dom; import java.io.File; import java.io.IOException; import javax.xml. ...

  8. pytorch旧版安装

    https://pytorch.org/get-started/previous-versions 可以直接下载文件 用 pip 直接在下载目录安装就可以了

  9. vscode golang vue配置

    { "files.autoSave": "off", "window.title": "${dirty}${activeEdito ...

  10. H3C路由器Telnet服务配置命令