happiness

题目

高一一班的座位表是个n×m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。

INPUT

第一行两个正整数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列的同学同时选择理科获得的额外喜悦值。

OUTPUT

输出一个整数,表示喜悦值总和的最大值

SAMPLE

INPUT

1 2
1 1
100 110
1
1000

OUTPUT

1210

解题报告

选择不同时不能得到额外的权值,所以源点对所有点来说都是文科,汇点对所有点来说都是理科。
对于单独两个点来说,只有两种情况。
若两个人都选文科,需要割掉第2,4条边,代价为两个人选理科分别的贡献,以及他们一起选理科的贡献,因为所有的点都是等价的,2,4边的权值除各自选理科贡献外再加上一半的额外贡献。
若两个人都选择理科同理。
若两个人选择不同,假设x选择文科,y选择理科,那么需要割掉2,3,5。
此时2,3权值和为分别选择科目的贡献和一半的同时选择理科和同时选择文科的贡献。还需再减去剩余的一半,即应是5的权值。(x,y间要建双向边。)
 #include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum;
}
struct edge{
int e,n,w;
}a[];
int pre[],tot;
inline void insert(int s,int e,int w){
a[tot].e=e;
a[tot].w=w;
a[tot].n=pre[s];
pre[s]=tot++;
}
int n,m;
int w[][],l[][];
int jz1[][],jz2[][],jz3[][],jz4[][];
int sum(),ans(),inf(0x7fffffff);
int S(),T;
int id[][];
inline void init(){
freopen("nt2011_happiness.in","r",stdin);
freopen("nt2011_happiness.out","w",stdout);
memset(pre,-,sizeof(pre));
n=read(),m=read();
T=n*m+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
w[i][j]=read()<<,sum+=w[i][j]>>,id[i][j]=(i-)*m+j;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
l[i][j]=read()<<,sum+=l[i][j]>>;
for(int i=;i<n;i++)
for(int j=;j<=m;j++)
jz1[i][j]=read(),sum+=jz1[i][j];
for(int i=;i<n;i++)
for(int j=;j<=m;j++)
jz2[i][j]=read(),sum+=jz2[i][j];
for(int i=;i<=n;i++)
for(int j=;j<m;j++)
jz3[i][j]=read(),sum+=jz3[i][j];
for(int i=;i<=n;i++)
for(int j=;j<m;j++)
jz4[i][j]=read(),sum+=jz4[i][j];
}
inline void build(){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
insert(S,id[i][j],w[i][j]+jz1[i][j]+jz1[i-][j]+jz3[i][j]+jz3[i][j-]),insert(id[i][j],S,);
insert(id[i][j],T,l[i][j]+jz2[i][j]+jz2[i-][j]+jz4[i][j]+jz4[i][j-]),insert(T,id[i][j],);
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(i!=n)
insert(id[i][j],id[i][j]+m,jz1[i][j]+jz2[i][j]),insert(id[i][j]+m,id[i][j],jz1[i][j]+jz2[i][j]);
if(j!=m)
insert(id[i][j],id[i][j]+,jz3[i][j]+jz4[i][j]),insert(id[i][j]+,id[i][j],jz3[i][j]+jz4[i][j]);
}
}
int dis[];
inline bool bfs(int s,int t){
memset(dis,,sizeof(dis));
dis[s]=;
queue<int>q;
q.push(s);
while(!q.empty()){
int k(q.front());
q.pop();
for(int i=pre[k];i!=-;i=a[i].n){
int e(a[i].e);
if(!dis[e]&&a[i].w){
dis[e]=dis[k]+;
q.push(e);
if(e==t)
return true;
}
}
}
return false;
}
inline int my_min(int a,int b){
return a<b?a:b;
}
inline int dfs(int now,int flow){
if(now==T)
return flow;
int tmp(flow),f;
for(int i=pre[now];i!=-;i=a[i].n){
int e(a[i].e);
if(dis[e]==dis[now]+&&tmp&&a[i].w){
f=dfs(e,my_min(tmp,a[i].w));
if(!f){
dis[e]=;
continue;
}
a[i].w-=f;
a[i^].w+=f;
tmp-=f;
}
}
return flow-tmp;
}
inline void dinic(){
while(bfs(S,T))
ans+=dfs(S,inf);
printf("%d",sum-(ans>>));
}
inline int gg(){
init();
build();
dinic();
return ;
}
int K(gg());
int main(){;}

最新文章

  1. 【NOIP2009 T3】 最佳贸易 (双向SPFA)
  2. socket编程listen函数限制连接数的解决方案
  3. java 接口(interface)
  4. TopFreeTheme精选免费模板【20130701.特别版】
  5. 由于SSH配置文件的不匹配,导致的Permission denied (publickey)及其解决方法。
  6. JS调用客户端EXE
  7. POJ 2112 Optimal Milking (Floyd+二分+最大流)
  8. 高效使用Bitmaps(三) 神奇的Cache
  9. NULL, nil, Nil详解
  10. Cocos2d-x V2.x -- 开发进阶和高级实例教程(一) 转
  11. 关于excel的导入导出
  12. 新概念英语(1-115)Knock! Knock!
  13. C++ 精英化趋势
  14. Android取得系统时间
  15. 001 大数据情况下linux的配置
  16. CF126B
  17. 使用xadmin更新数据时,报错expected string or bytes-like object
  18. &lt;三&gt;年编程经验、何去何从?
  19. BS一机双屏的解决方式
  20. 厦门Uber优步司机奖励政策(12月14日到12月20日)

热门文章

  1. XCOM2中敌对生物设计分析(ADVENT篇)
  2. php利用gd实现图片的边框
  3. 类型转换之 PropertyEditorSupport类
  4. cygwin vi编辑器左右上下键和删除键乱码错误
  5. Angular4 后台管理系统搭建(1) - 建立一个通用的Wijmo5 flexgrid分页器组件
  6. 框架基础:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码
  7. Python3组合数据类型(元组、列表、集合、字典)语法
  8. FileMethods
  9. mybatis中resultType和resultMap的联系
  10. Mybatis-多对多