zoukankan      html  css  js  c++  java
  • BZOJ2127: happiness

    BZOJ2127: happiness

    Description

    高一一班的座位表是个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

    Sample Output

    1210
    【样例说明】
    两人都选理,则获得100+110+1000的喜悦值。
    【数据规模】
    对于100%以内的数据,n,m<=100 所有喜悦值均为小于等于5000的非负整数

    题解Here!

    又是最小割。。。
    还是某个题的加强版:

    BZOJ3894: 文理分科

    用同样的方法就好。

    附代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<queue>
    #define MAXN 50010
    #define MAX 999999999
    using namespace std;
    int n,m,s,t,c=2,sum=0;
    int head[MAXN],deep[MAXN];
    struct Edge{
    	int next,to,w;
    }a[MAXN*6];
    inline int read(){
    	int date=0,w=1;char c=0;
    	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
    	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
    	return date*w;
    }
    inline int id(int x,int y){return (x-1)*m+y;}
    inline void add(int u,int v,int w){
    	a[c].to=v;a[c].w=w;a[c].next=head[u];head[u]=c++;
    	a[c].to=u;a[c].w=0;a[c].next=head[v];head[v]=c++;
    }
    bool bfs(){
    	int u,v;
    	queue<int> q;
    	for(int i=1;i<=t;i++)deep[i]=0;
    	deep[s]=1;
    	q.push(s);
    	while(!q.empty()){
    		u=q.front();
    		q.pop();
    		for(int i=head[u];i;i=a[i].next){
    			v=a[i].to;
    			if(a[i].w&&!deep[v]){
    				deep[v]=deep[u]+1;
    				if(v==t)return true;
    				q.push(v);
    			}
    		}
    	}
    	return false;
    }
    int dfs(int x,int limit){
    	if(x==t)return limit;
    	int v,sum,cost=0;
    	for(int i=head[x];i;i=a[i].next){
    		v=a[i].to;
    		if(a[i].w&&deep[v]==deep[x]+1){
    			sum=dfs(v,min(a[i].w,limit-cost));
    			if(sum>0){
    				a[i].w-=sum;
    				a[i^1].w+=sum;
    				cost+=sum;
    				if(cost==limit)break;
    			}
    			else deep[v]=-1;
    		}
    	}
    	return cost;
    }
    int dinic(){
    	int ans=0;
    	while(bfs())ans+=dfs(s,MAX);
    	return ans;
    }
    void init(){
    	int now,w;
    	n=read();m=read();
    	now=n*m;
    	s=now*5+1;t=now*5+2;
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++){
    		w=read();
    		sum+=w;
    		add(s,id(i,j),w);
    	}
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++){
    		w=read();
    		sum+=w;
    		add(id(i,j),t,w);
    	}
    	for(int i=1;i<=n-1;i++)
    	for(int j=1;j<=m;j++){
    		w=read();
    		sum+=w;
    		now++;
    		add(s,now,w);
    		add(now,id(i,j),MAX);
    		add(now,id(i+1,j),MAX);
    	}
    	for(int i=1;i<=n-1;i++)
    	for(int j=1;j<=m;j++){
    		w=read();
    		sum+=w;
    		now++;
    		add(now,t,w);
    		add(id(i,j),now,MAX);
    		add(id(i+1,j),now,MAX);
    	}
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=m-1;j++){
    		w=read();
    		sum+=w;
    		now++;
    		add(s,now,w);
    		add(now,id(i,j),MAX);
    		add(now,id(i,j+1),MAX);
    	}
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=m-1;j++){
    		w=read();
    		sum+=w;
    		now++;
    		add(now,t,w);
    		add(id(i,j),now,MAX);
    		add(id(i,j+1),now,MAX);
    	}
    }
    int main(){
    	init();
    	printf("%d
    ",sum-dinic()); 
    	return 0;
    }
    
  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/Yangrui-Blog/p/10547195.html
Copyright © 2011-2022 走看看