题目链接:https://cn.vjudge.net/contest/281959#problem/D

题目大意:中文题目

具体思路:我们需要求出最大的满意值,从另一方面想,我们可以求出总的满意值,然后再求出不符合情况的最小的代价,这两个相减,就能求出最大的满意值,这个时候就可以通过最小割来求了(最小割:使得整个图不连通的最小花费)。

这一篇博客讲的很好:https://blog.csdn.net/yakeding/article/details/79357545

AC代码:

  1. #include<iostream>
  2. #include<stack>
  3. #include<queue>
  4. #include<iomanip>
  5. #include<stdio.h>
  6. #include<cstring>
  7. #include<cstring>
  8. #include<cmath>
  9. #include<algorithm>
  10. #include<map>
  11. #include<vector>
  12. using namespace std;
  13. # define ll long long
  14. # define maxn +
  15. # define inf 0x3f3f3f3f
  16. int prev[maxn];//边的编号
  17. int head[maxn];
  18. int f[][]= {{,-,,},{,,,-}};
  19. struct node
  20. {
  21. int to;
  22. int flow;
  23. int nex;
  24. } edge[maxn];
  25. int num,st,ed;
  26. void init()
  27. {
  28. memset(head,-,sizeof(head));
  29. num=;
  30. }
  31. void addedge(int fr,int to,int flow)
  32. {
  33. edge[num].to=to;
  34. edge[num].flow=flow;
  35. edge[num].nex=head[fr];
  36. head[fr]=num++;
  37. edge[num].to=fr;
  38. edge[num].flow=;
  39. edge[num].nex=head[to];
  40. head[to]=num++;
  41. }
  42. bool bfs()
  43. {
  44. memset(prev,-,sizeof(prev));
  45. prev[st]=;
  46. queue<int>q;
  47. q.push(st);
  48. while(!q.empty())
  49. {
  50. int top=q.front();
  51. q.pop();
  52. for(int i=head[top]; i!=-; i=edge[i].nex)
  53. {
  54. int temp=edge[i].to;
  55. if(prev[temp]==-&&edge[i].flow>)
  56. {
  57. prev[temp]=prev[top]+;
  58. q.push(temp);
  59. }
  60. }
  61. }
  62. return prev[ed]!=-;
  63. }
  64. int dfs(int u,int flow)
  65. {
  66. if(u==ed)
  67. return flow;
  68. int res=;
  69. for(int i=head[u]; i!=-; i=edge[i].nex)
  70. {
  71. int t=edge[i].to;
  72. if(prev[t]==(prev[u]+)&&edge[i].flow>)
  73. {
  74. int temp=dfs(t,min(flow,edge[i].flow));
  75. edge[i].flow-=temp;
  76. edge[i^].flow+=temp;
  77. res+=temp;
  78. flow-=temp;
  79. if(flow==)
  80. break;
  81. }
  82. }
  83. if(res==)
  84. prev[u]=-;
  85. return res;
  86. }
  87. int n,m;
  88. int dinic()
  89. {
  90. int ans=;
  91. while(bfs())
  92. {
  93. ans+=dfs(st,inf);
  94. }
  95. return ans;
  96. }
  97. bool judge(int t1,int t2)
  98. {
  99. if(t1>=&&t1<=n&&t2>=&&t2<=m)
  100. return true;
  101. return false;
  102. }
  103. int main()
  104. {
  105. init();
  106. int sum=;
  107. int tmp;
  108. st=1e5,ed=1e5+;
  109. scanf("%d %d",&n,&m);
  110. for(int i=; i<=n; i++)
  111. {
  112. for(int j=; j<=m; j++)
  113. {
  114. scanf("%d",&tmp);
  115. sum+=tmp;
  116. addedge((i-)*m+j,ed,tmp);
  117. }
  118. }
  119. for(int i=; i<=n; i++)
  120. {
  121. for(int j=; j<=m; j++)
  122. {
  123. scanf("%d",&tmp);
  124. sum+=tmp;
  125. addedge(st,(i-)*m+j,tmp);
  126. }
  127. }
  128. for(int i=; i<=n; i++)
  129. {
  130. for(int j=; j<=m; j++)
  131. {
  132. scanf("%d",&tmp);
  133. addedge((i-)*m+j,((i-)*m+j)+n*m,inf);
  134. addedge(((i-)*m+j)+n*m,ed,tmp);
  135. sum+=tmp;
  136. for(int k=; k<; k++)
  137. {
  138. int x=i+f[][k];
  139. int y=j+f[][k];
  140. if(judge(x,y))
  141. addedge((x-)*m+y,((i-)*m+j)+n*m,inf);
  142. }
  143. }
  144. }
  145. for(int i=; i<=n; i++)
  146. {
  147. for(int j=; j<=m; j++)
  148. {
  149. scanf("%d",&tmp);
  150. sum+=tmp;
  151. addedge(((i-)*m+j)+n*m*,(i-)*m+j,inf);
  152. addedge(st,((i-)*m+j)+n*m*,tmp);
  153. for(int k=; k<; k++)
  154. {
  155. int x=i+f[][k];
  156. int y=j+f[][k];
  157. if(judge(x,y))
  158. addedge(((i-)*m+j)+n*m*,(x-)*m+y,inf);
  159. }
  160. }
  161. }
  162. // cout<<1<<endl;
  163. int ans=dinic();
  164. // cout<<1<<endl;
  165. printf("%d\n",sum-ans);
  166. return ;
  167. }

D - 文理分科 (网络流->最小割)的更多相关文章

  1. 【bzoj3894】文理分科 网络流最小割

    原文地址:http://www.cnblogs.com/GXZlegend 题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用 ...

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

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

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

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

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

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

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

    题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...

  6. bzoj 3894 文理分科【最小割+dinic】

    谁说这道和2127是双倍经验的来着完全不一样啊? 数组开小会TLE!数组开小会TLE!数组开小会TLE! 首先sum统计所有收益 对于当前点\( (i,j) \)考虑,设\( x=(i-1)*m+j ...

  7. 【题解】 bzoj3894: 文理分科 (网络流/最小割)

    bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...

  8. 【bzoj3774】最优选择 网络流最小割

    题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...

  9. 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割

    题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...

随机推荐

  1. Django-website 程序案例系列-3 URL详解

    django参考资料:http://docs.30c.org/djangobook2/index.html urls.py是django中控制接收前端的参数指定函数去执行逻辑 第一种 函数的方式 ur ...

  2. IDEA在debug时修改变量值

    IDEA在debug调试时修改变量值 例如以下代码: int y1 = 0; anchor.setDy1(y1); 在代码中,这个y1永远是0,但是y1本身是个变量 debug的时候获取到这个属性,并 ...

  3. day6 三级菜单

    #__author__: Administrator #__date__: 2018/7/12 china = { "shandong":{ "linyi":[ ...

  4. day30 item系列

    item 会将数据操作类似于字典的操作具体用到的方法 __getitem__(self, item): __setitem__(self, key, value): __delitem__(self, ...

  5. IDEA安装和激活

    IDEA安装 按照最新版本有可能会有很多BUG的原则,我们就安装IDEA 2018.1.6版本的. 首先,我们到IDEA官网去下载IDEA,官网链接,但是这个界面的版本一般为最新的. 这里我放出IDE ...

  6. C# 类&结构体&枚举

    类: class Lei  //要和static void Main(string[] args)平级: { public int lei_int;  //public是关键字,代表访问权限,这里是公 ...

  7. eclipse --- 新建JSP页面默认模版设置

    设置 在eclipse中新建 jsp时是这样的: 有时候我们不想字符集是ISO_8859-1,想字符集是UTF-8,一个个修改会很麻烦,那么我们可以修改jsp模版的设置: window>Pref ...

  8. bug8 eclipse项目导入到myeclipse时 Target runtime com.genuitec.runtime.generic

    1.新导入的工程,出问题很大可能是jdk的版本问题导致,检查一下,发现jdk果然不一致,修改了jdk版本,但异常没有消除 2.网上查询下解决方案,原来在工程目录下的settings,有个文件也需要修改 ...

  9. Linux下,根据FHS定义出来的每个目录的作用

    (下表摘自<鸟哥的Linux的私房菜>) 在Linux下,根据FHS定义出来的每个目录应该放置的档案内容为: 目录 应放置档案内容 / 根目录 root (/),一般建议在根目录底下只接目 ...

  10. 线程优先级.Priority()

    线程对象.Priority(),线程优先级1-10,10优先级最高.此功能比较鸡肋,不起作用.了解即可 以下案例:循环输出加减乘除,除优先级最高 //MyThread线程 class MyThread ...