A1261. happiness(吴确)
时间限制:500ms   内存限制:512.0MB  
总提交次数:158   AC次数:72   平均分:56.71
 
将本题分享到:
      
试题来源
  2011中国国家集训队命题答辩
问题描述
  高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。
输入格式
  第一行两个正整数n,m。
  接下来是六个矩阵
  第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择文科获得的喜悦值。
  第二个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择理科获得的喜悦值。
  第三个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择文科获得的额外喜悦值。
  第四个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择理科获得的额外喜悦值。
  第五个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择文科获得的额外喜悦值。
  第六个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择理科获得的额外喜悦值。
输出格式
  输出一个整数,表示喜悦值总和的最大值
样例输入
1 2
1 1
100 110
1
1000
样例输出
1210
样例说明
  两人都选理,则获得100+110+1000的喜悦值。
数据规模和约定
  对于10%以内的数据,n,m<=4
  对于30%以内的数据,n,m<=8
  对于100%以内的数据,n,m<=100 数据保证答案在2^30以内
  对于100%的数据,时间限制为0.5s。

源代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #define EF if(ch==EOF) return x;
  5. #define rep for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
  6. #define rep1 for(int i=1;i<n;i++)for(int j=1;j<=m;j++)
  7. #define rep2 for(int i=1;i<=n;i++)for(int j=1;j<m;j++)
  8. using namespace std;
  9. const int Z=105;
  10. const int N=Z*Z;
  11. const int M=N*30;
  12. struct edge{int v,next,cap;}e[M<<1];int tot=1,head[N];
  13. int n,m,cnt,res,ans,S,T,dis[N],q[N+M];
  14. int a[Z][Z],b[Z][Z],id[Z][Z];
  15. inline int read(){
  16. int x=0,f=1;char ch=getchar();
  17. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;EF;ch=getchar();}
  18. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  19. return x*f;
  20. }
  21. void add(int x,int y,int z){
  22. e[++tot].v=y;e[tot].cap=z;e[tot].next=head[x];head[x]=tot;
  23. e[++tot].v=x;e[tot].cap=0;e[tot].next=head[y];head[y]=tot;
  24. }
  25. void Add(int x,int y,int z){
  26. e[++tot].v=y;e[tot].cap=z;e[tot].next=head[x];head[x]=tot;
  27. e[++tot].v=x;e[tot].cap=z;e[tot].next=head[y];head[y]=tot;
  28. }
  29. bool bfs(){
  30. memset(dis,-1,sizeof dis);
  31. int h=0,t=1;q[t]=S;dis[S]=0;
  32. while(h!=t){
  33. int x=q[++h];
  34. for(int i=head[x];i;i=e[i].next){
  35. if(e[i].cap&&dis[e[i].v]==-1){
  36. dis[e[i].v]=dis[x]+1;
  37. if(e[i].v==T) return 1;
  38. q[++t]=e[i].v;
  39. }
  40. }
  41. }
  42. return 0;
  43. }
  44. int dfs(int x,int f){
  45. if(x==T) return f;
  46. int used=0,t;
  47. for(int i=head[x];i;i=e[i].next){
  48. if(e[i].cap&&dis[e[i].v]==dis[x]+1){
  49. t=dfs(e[i].v,min(e[i].cap,f));
  50. e[i].cap-=t;e[i^1].cap+=t;
  51. used+=t;f-=t;
  52. if(!f) return used;
  53. }
  54. }
  55. if(!used) dis[x]=-1;
  56. return used;
  57. }
  58. void dinic(){
  59. res=0;
  60. while(bfs()) res+=dfs(S,2e9);
  61. }
  62. int main(){
  63. n=read();m=read();
  64. rep a[i][j]=read();
  65. rep b[i][j]=read();
  66. rep id[i][j]=++cnt;
  67. S=0;T=cnt+1;
  68. #define u id[i][j]
  69. #define v id[i+1][j]
  70. rep{
  71. add(S,u,b[i][j]<<1);
  72. add(u,T,a[i][j]<<1);
  73. ans+=a[i][j]+b[i][j];
  74. }
  75. rep1 a[i][j]=read();
  76. rep1 b[i][j]=read();
  77. rep1{
  78. add(S,u,b[i][j]);add(S,v,b[i][j]);
  79. add(u,T,a[i][j]);add(v,T,a[i][j]);
  80. Add(u,v,a[i][j]+b[i][j]);
  81. ans+=a[i][j]+b[i][j];
  82. }
  83. #undef v
  84. #define v id[i][j+1]
  85. rep2 a[i][j]=read();
  86. rep2 b[i][j]=read();
  87. rep2{
  88. add(S,u,b[i][j]);add(S,v,b[i][j]);
  89. add(u,T,a[i][j]);add(v,T,a[i][j]);
  90. Add(u,v,a[i][j]+b[i][j]);
  91. ans+=a[i][j]+b[i][j];
  92. }
  93. dinic();
  94. res>>=1;
  95. printf("%d",ans-res);
  96. return 0;
  97. }

A1261. happiness(吴确)[二元组暴力最小割建模]的更多相关文章

  1. 【COGS 1873】 [国家集训队2011]happiness(吴确) 最小割

    这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们S表示文T表示理,中间一排点是每个人,每个人向两边连其选文或者选理的价值,中间每 ...

  2. POJ 3469 Dual Core CPU (最小割建模)

    题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...

  3. POJ 3084 Panic Room (最小割建模)

    [题意]理解了半天--大意就是,有一些房间,初始时某些房间之间有一些门,并且这些门是打开的,也就是可以来回走动的,但是这些门是确切属于某个房间的,也就是说如果要锁门,则只有在那个房间里才能锁. 现在一 ...

  4. 【GCJ2008E】日程表 最小割

    Google Code Jam 2008 E 日程表 [题目描述] 热情的选手Sphinny正在看新一年的日程表,并发现已经安排了很多编 程竞赛.她将这一年的每一天都用以下三种方式之一在日程表上打标记 ...

  5. [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  6. CodeForces1082G Petya and Graph 最小割

    网络流裸题 \(s\)向点连边\((s, i, a[i])\) 给每个边建一个点 边\((u, v, w)\)抽象成\((u, E, inf)\)和\((v, E, inf)\)以及边\((E, t, ...

  7. bzoj 1412 最小割 网络流

    比较明显的最小割建模, 因为我们需要把狼和羊分开. 那么我们连接source和每个羊,流量为inf,代表这条边不能成为最小割中的点,同理连接每个狼和汇,流量为inf,正确性同上,那么对于每个相邻的羊和 ...

  8. SP839 Optimal marks(最小割)

    SP839 Optimal marks(最小割) 给你一个无向图G(V,E). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记.对于边(u,v),我们定义Cost(u,v)= ...

  9. 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割

    题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...

随机推荐

  1. 【微信小程序】退款功能教程(含申请退款和退款回调)

    1.一定要区分小程序和公众号的退款,唯一的区别就是 appid不一样,其他的都是一样的. 不废话,直接写代码了啊. 放大招!!! 然后,需要注意的:最好是把证书放在下面的php的同级或者下级. 证书的 ...

  2. PHP-客户端的IP地址伪造、CDN、反向代理、获取的那些事儿

    外界流传的JAVA/PHP服务器端获取客户端IP都是这么取的: 伪代码: 1)ip = request.getHeader("X-FORWARDED-FOR")     可伪造,参 ...

  3. canvas学习笔记(上篇)-- canvas入门教程 -- canvas标签/方块/描边/路径/圆形/曲线

    [上篇] -- 建议学习时间4小时  课程共(上中下)三篇 此笔记是我初次接触canvas的时候的学习笔记,这次特意整理为博客供大家入门学习,几乎涵盖了canvas所有的基础知识,并且有众多练习案例, ...

  4. Android TCP/IP Socket Test

    TCP/IP协议:Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本 ...

  5. 使用swagger实现在线api文档自动生成 在线测试api接口

    使用vs nuget包管理工具搜索Swashbuckle 然后安装便可 注释依赖于vs生成的xml注释文件

  6. Postman---html中get和post的区别和使用

    get和post的区别和使用 Html中post和get区别,是不是用get的方法用post都能办到? Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DEL ...

  7. windows和linux中换行符的转换

    数据开发平台使用上传脚本报错:保存失败,文件编码格式不正确,请修改文件换行符为Unix终束符! 修改方式:DOS系统下,使用文本编译器另存为,然后选择换行符为unix终束符. 解释: windows ...

  8. ZooKeeperEclipse 插件

    插件地址:ZooKeeperEclipse  http://www.massedynamic.org/eclipse/updates/ 安装ZooKeeperEclipse插件步骤如下: Step 1 ...

  9. linode下更换内核(debian,ubuntu,centos)

    1.首先到这个网址下载你需要得内核文件,以genric:http://kernel.ubuntu.com/~kernel-ppa/mainline/ 如果系统是 64 位,则下载 amd64 的 li ...

  10. makefile之short函数

    函数名称:排序函数-$(sort LIST) 函数功能:给字串"LIST"中的单词以首字母为准进行排序(升序),并去掉重复的单词. 返回值:空格分割的没有重复单词的字串. 函数说明 ...