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. css3 使用animation实现动画效果

    .rotation { -webkit-animation-name: rotation; -webkit-animation-duration: 30s; -moz-animation-name: ...

  2. 无法删除尚未附加的实体-linq中使用反射删除记录出现错误,应该如何解决。

    db.airports.Attach(data); db.airports.DeleteOnSubmit(data); db.SubmitChanges();

  3. 图片onerror事件,为图片加载指定默认图片

    为图片指定加载失败时显示默认图片,js输出的img对象,onerror是事件,不是属性,所以这样写是不起作用的: var img = $(document.createElement("IM ...

  4. 解决Jenkins无法编译Egret5.0项目的问题

    问题的原因可查看:https://blog.csdn.net/sujun10/article/details/75512929 解决 造成这个问题的原因是用户权限分配,你可以通过下面几步解决,而非改e ...

  5. ActiveMQ从源代码构建

    众多开源项目.我们一般都是直接拿过来用之而后快. 只是我们也应该知道这些项目是怎样从源代码构建而来的. 既然代码是写出来的,就不能避免有BUG存在,话说没有完美的软件,也没有无漏洞的程序. 事实上从源 ...

  6. Python 函数进阶(filter/map/json/zip)

    一.函数即变量 def say(name): print(name)ybq = say #可以被赋值给其他变量ybq('Amily') #调用函数 函数名:say 函数体:第1-2行 返回值:retu ...

  7. 最大子矩阵 hdu1081

    To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. HTML中让表单input等文本框为只读不可编辑但可以获取value值的方法;让文本域前面的内容显示在左上角,居中

      HTML中让表单input等文本框为只读不可编辑的方法 有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使input text的内容,中国两个字不可以修改   有时候,我们希望 ...

  9. 线程同步工具CountDownLatch

    CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行.假如我们这个想要继续往下执行的任务调用一个CountDownLatc ...

  10. SQL语句大全2

    SQL 语句大全 --语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE -- ...