【试题来源】

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。
solution:
(ps:这个题输入是真的new bee)
网络流之最大流的最小割
用到了 翻转源汇 
1.先考虑两个点的情况 设cw为同选文 cl为同选理 w为选文happiness l为选理happiness

据图当 1.i 文 j 理 2.i,j同文 3.i理 j文 4.i,j同理四种情况时,把边割掉,用  总的-割的  就是答案

2.当多个点时也一样,S-i / i-T 都是i周围的 (同文+同理)/2  i-j都是  (同文+同理)(i,j的)/2

注意:

1.一开始先乘2,最后再/2,就不用double了

2.数组开10005/105  不要开10001/101

3.连的时候不要重复

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 //#define dd double
  5 #define mem(a,b) memset(a,b,sizeof(a))
  6 using namespace std;
  7 const int N=105;
  8 const int INF=(1<<31)-1;
  9 inline int minn(int a,int b){return a<b?a:b;}
 10 struct son
 11 {
 12     int v,next,u;
 13     int w;
 14 };
 15 son a1[1000001];
 16 int first[1000001],e;
 17 inline void addbian(int u,int v,int w)
 18 {
 19     a1[e].u=u;
 20     a1[e].v=v;
 21     a1[e].w=w;
 22     a1[e].next=first[u];
 23     first[u]=e++;
 24 }
 25
 26 int dui[10000001],he,en;
 27 inline void clear(){he=1;en=0;}
 28 inline void push(int x){dui[++en]=x;}
 29 inline int top(){return dui[he];}
 30 inline void pop(){++he;}
 31 inline bool empty(){return en>=he?0:1;}
 32
 33 int n,m,S,T;
 34 int sum;
 35 int wen[N][N],li[N][N];
 36 int xiawen[N][N],xiali[N][N];
 37 int youwen[N][N],youli[N][N];
 38
 39 int ha[N][N];
 40 int wensum[10005],lisum[10005];
 41
 42 int dep[10005];
 43
 44 int bfs()
 45 {
 46     mem(dep,0);clear();
 47     dep[S]=1;push(S);
 48     while(!empty())
 49     {
 50         int now=top();pop();
 51         for(int i=first[now];i!=-1;i=a1[i].next)
 52         {
 53             int temp=a1[i].v;
 54             if(!a1[i].w||dep[temp])continue;
 55             dep[temp]=dep[now]+1;
 56             push(temp);
 57             if(temp==T)return 1;
 58         }
 59     }
 60     return 0;
 61 }
 62
 63 int dfs(int x,int val)
 64 {
 65     if(x==T)return val;
 66     int val2=val,k;
 67     for(int i=first[x];i!=-1;i=a1[i].next)
 68     {
 69         int temp=a1[i].v;
 70         if(dep[temp]!=dep[x]+1||!val2||!a1[i].w)continue;
 71         k=dfs(temp,minn(val2,a1[i].w));
 72         if(!k){dep[temp]=0;continue;}
 73         a1[i].w-=k;a1[i^1].w+=k;val2-=k;
 74     }
 75     return val-val2;
 76 }
 77
 78 int Dinic()
 79 {
 80     int ans=0;
 81     while(bfs())
 82       ans+=dfs(S,INF);
 83     return ans;
 84 }
 85
 86 int main(){
 87     //freopen("nt2011_happiness.in","r",stdin);
 88     //freopen("nt2011_happiness.out","w",stdout);
 89     //freopen("1.txt","r",stdin);
 90     mem(first,-1);
 91     scanf("%d%d",&n,&m);
 92     S=0;T=n*m+1;
 93     for(int i=1;i<=n;++i)
 94       for(int j=1;j<=m;++j)
 95       {ha[i][j]=(i-1)*m+j;}
 96
 97     for(int i=1;i<=n;++i)
 98       for(int j=1;j<=m;++j)
 99       {scanf("%d",&wen[i][j]);wen[i][j]*=2;sum+=wen[i][j];}
100     for(int i=1;i<=n;++i)
101       for(int j=1;j<=m;++j)
102       {scanf("%d",&li[i][j]);li[i][j]*=2;sum+=li[i][j];}
103
104     for(int i=1;i<n;++i)
105       for(int j=1;j<=m;++j)
106       {scanf("%d",&xiawen[i][j]);xiawen[i][j]*=2;sum+=xiawen[i][j];}
107     for(int i=1;i<n;++i)
108       for(int j=1;j<=m;++j)
109       {scanf("%d",&xiali[i][j]);xiali[i][j]*=2;sum+=xiali[i][j];}
110
111     for(int i=1;i<=n;++i)
112       for(int j=1;j<m;++j)
113       {scanf("%d",&youwen[i][j]);youwen[i][j]*=2;sum+=youwen[i][j];}
114     for(int i=1;i<=n;++i)
115       for(int j=1;j<m;++j)
116       {scanf("%d",&youli[i][j]);youli[i][j]*=2;sum+=youli[i][j];}
117     //
118     for(int i=1;i<=n;++i)
119       for(int j=1;j<=m;++j)
120       {
121         wensum[ha[i][j]]=wen[i][j]+((i>1?xiawen[i-1][j]:0)+(i<n?xiawen[i][j]:0)+(j>1?youwen[i][j-1]:0)+(j<m?youwen[i][j]:0))/2;
122             lisum[ha[i][j]]=li[i][j]+((i>1?xiali[i-1][j]:0)+(i<n?xiali[i][j]:0)+(j>1?youli[i][j-1]:0)+(j<m?youli[i][j]:0))/2;
123         }
124
125     for(int i=1;i<T;++i)
126     {addbian(S,i,wensum[i]);addbian(i,S,0);}
127     for(int i=1;i<T;++i)
128     {addbian(i,T,lisum[i]);addbian(T,i,0);}
129
130     for(int i=1;i<=n;++i)
131       for(int j=1;j<=m;++j)
132       {
133             /*if(i>1)
134             {
135                 addbian(ha[i][j],ha[i-1][j],(xiawen[i-1][j]+xiali[i-1][j])/2);
136                 addbian(ha[i-1][j],ha[i][j],(xiawen[i-1][j]+xiali[i-1][j])/2);
137             }*/
138             if(i<n)
139             {
140                 addbian(ha[i][j],ha[i+1][j],(xiawen[i][j]+xiali[i][j])/2);
141                 addbian(ha[i+1][j],ha[i][j],(xiawen[i][j]+xiali[i][j])/2);
142             }
143             /*if(j>1)
144             {
145                 addbian(ha[i][j],ha[i][j-1],(youwen[i][j-1]+youli[i][j-1])/2);
146                 addbian(ha[i][j-1],ha[i][j],(youwen[i][j-1]+youli[i][j-1])/2);
147             }*/
148             if(j<m)
149             {
150                 addbian(ha[i][j],ha[i][j+1],(youwen[i][j]+youli[i][j])/2);
151                 addbian(ha[i][j+1],ha[i][j],(youwen[i][j]+youli[i][j])/2);
152             }
153         }
154
155     //printf("sum=%d\n",sum/2);
156
157     printf("%d",(sum-Dinic())/2);
158     //while(1);
159     return 0;
160 }

code

转载于:https://www.cnblogs.com/A-LEAF/p/7257650.html

国家集训队2011 happiness相关推荐

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

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

  2. happiness[国家集训队2011(吴确)]

    [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...

  3. [国家集训队2011]跳跳棋

    P1852 [国家集训队]跳跳棋https://www.luogu.org/problemnew/show/P1852 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不 ...

  4. 题解 【国家集训队2011】数颜色

    题面 解析 这题也就是一个带修改的莫队啊啊!! 所以,我们只需要在普通莫队上加上一维时间即可. 怎么加呢? 只需要记录下每次修改和查询的时间, 在左右端点跳跃的同时,也将时间跳到询问的时间就行了. 具 ...

  5. 【国家集训队2011】【BZOJ2141】排队

    Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的 ...

  6. bzoj2144 【国家集训队2011】跳跳棋

    Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...

  7. [国家集训队2011]稳定婚姻(无向图定向)

    题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到 ...

  8. [国家集训队2011]拆迁队nbsp;解题报告

    题目: http://cogs.pro/cogs/problem/problem.php?pid=1859 lanxisi带领着他的拆迁队来整治一个街道.这个街道由N个旧房子组成,从左到右编号为1.. ...

  9. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

最新文章

  1. 博客园自定义页面风格设计 后续篇(页面设计模式及代码高亮 鼠标点击效果升级)...
  2. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码
  3. jQuery自定义选择器
  4. SpringCloud Zuul(四)之工作原理
  5. nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),nc、ndf是什么?
  6. java SSH编码规范
  7. python的zip函数_python的zip函数
  8. 各省简称 拼音 缩写_全国城市拼音 缩写
  9. flash 实例教程
  10. 5款好看的WordPress博客主题下载
  11. 【数电基础知识】各逻辑运算符号盘点
  12. python断言语句的语法_Python断言教程
  13. 人工智能现状和发展趋势
  14. 怎样从电脑传入视频到ipad 播放
  15. 督查督办管理系统在企业管理中起到的作用
  16. find:paths must precede expression问题及解决
  17. 织梦DedeCMS管理员动态密码登录插件下载
  18. 无法使用此产品的安装源,请确认安装源存在,并且您可以访问它
  19. CNN经典算法GoogleNet介绍(论文详细解读)
  20. 【TED】How to get better at the things you care about?

热门文章

  1. 多柱汉诺塔最优算法设计探究
  2. 好产品改变世界——《人人都是产品经理》即将上市
  3. ASP.NET(C#)获取客户端的网卡MAC代码
  4. 半监督学习的概述与思考,及其在联邦场景下的应用(续)
  5. 有什么推荐的计算机视觉项目?来自微软亚研院的清单
  6. CVPR 2019 | 腾讯AI:做好活体检测,模型重要,数据亦然
  7. 想要成为一名三维建模师?想要月薪10K?你了解这些吗?
  8. 【深度学习系列】——神经网络的可视化解释
  9. 腾讯PCG光影研究室招聘计算机视觉算法/实习生
  10. 如何深入理解计算机视觉?(附思维导图)