zoukankan      html  css  js  c++  java
  • tyvj1338 QQ农场

    背景

    Sandytea前段时间沉迷于QQ农场中……一天夜里,他梦见来到好友X的农场上……

    描述

    这个农场和游戏中略有不同。土地实际上是一个边长为N的正方形,由N*N块土地组成。
    在每块土地上,都种有一种农作物。如果他选择摘取一块土地上的农作物,就能获得一个固定的利润(当然,这个利润是正数)。不同土地上的利润多半是不同的。
    贪心的Sandytea本想摘取所有土地上的农作物。但是正当他准备行动时,却被告知不允许摘取了两块有公共边的土地上的作物,否则就会被主人的狗发现。
    Sandytea想知道,在不被狗抓住的前提下,他能获得的最大利益是多少。

    输入格式

    第一行:一个整数N,表示土地是一个边长为N的正方形。
    下面N行:每行N个正整数,描述了各块土地上的农作物的单位价值。

    输出格式

    输出一行,包含一个整数,为最大的收益。

    测试样例1

    输入


    7 7 
    54 54

    输出

    61

    备注

    数据范围:
    有10分的数据满足:N≤6
    另有20分的数据满足:N≤13
    另有30分的数据满足:N≤50
    另有40分的数据满足:N≤200
    所有数据满足:每块土地上作物的价值不超过100。改编自SPOJ
     
    最小割 网络流
    //Serene
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    const int maxn=200*200+10,maxm=4*maxn+maxn,INF=100;
    int n,k,S,T,tot;
    bool pl[maxn];int v[maxn];
    
    int aa;char cc;
    int read() {
    	aa=0;cc=getchar();
    	while(cc<'0'||cc>'9') cc=getchar();
    	while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
    	return aa;
    }
    
    struct Node{
    	int x,y,cap,flow;
    }node[2*maxm];
    
    int cur[maxn];
    int fir[maxn],nxt[2*maxm],e=1;
    void add(int x,int y,int z) {
    	node[++e].x=x;node[e].y=y;node[e].cap=z; nxt[e]=fir[x];fir[x]=e;
    	node[++e].x=y;node[e].y=x;node[e].cap=0; nxt[e]=fir[y];fir[y]=e;
    }
    
    int zz[maxn],dis[maxn],s=1,t=0;
    bool BFS() {
    	memset(dis,-1,sizeof(dis));
    	dis[S]=0; s=1,t=0;zz[++t]=S;
    	int x,y;
    	while(s<=t) {
    		x=zz[s];s++;
    		for(y=fir[x];y;y=nxt[y]) {
    			if(node[y].flow>=node[y].cap||dis[node[y].y]!=-1) continue;
    			dis[node[y].y]=dis[x]+1;
    			zz[++t]=node[y].y;
    		}
    	}
    	return dis[T]!=-1;
    }
    
    int DFS(int pos,int maxf) {
    	if(pos==T||!maxf) return maxf;
    	int rs=0,now;
    	for(int &y=cur[pos];y;y=nxt[y]) {
    		if(node[y].flow>=node[y].cap||dis[node[y].y]!=dis[node[y].x]+1) continue;
    		now=DFS(node[y].y,min(maxf,node[y].cap-node[y].flow));
    		node[y].flow+=now;
    		node[y^1].flow-=now;
    		rs+=now;
    		maxf-=now;
    	}
    	if(!rs) dis[pos]=-1;
    	return rs;
    }
    
    int Dinic() {
    	int rs=0;
    	while(BFS()) {
    		memcpy(cur,fir,sizeof(fir));
    		rs+=DFS(S,0x3f3f3f3f);
    	}
    	return rs;
    }
    
    int main() {
    	n=read();tot=n*n;
    	int x,y; S=tot+1;T=S+1;
    	tot=0;
    	for(int i=1;i<=n*n;++i) v[i]=read(),tot+=v[i];
    	for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) {
    		x=(i-1)*n+j;
    		if(pl[x]) continue;
    		if((i+j)%2==0) add(S,x,v[x]); else add(x,T,v[x]);
    		if(i!=n) {
    			if((i+j)%2==0) add(x,x+n,INF);
    			else add(x+n,x,INF);
    		}
    		if(j!=n) {
    			if((i+j)%2==0) add(x,x+1,INF);
    			else add(x+1,x,INF);
    		}
    	}
    	printf("%d",tot-Dinic());
    	return 0;
    }
    

      

    弱者就是会被欺负呀
  • 相关阅读:
    Java的快速失败和安全失败
    Java RMI与RPC的区别
    Java动态代理之JDK实现和CGlib实现(简单易懂)
    JVM——字节码增强技术简介
    Linux内存分配机制之伙伴系统和SLAB
    操作系统动态内存管理——malloc和free的工作机制
    Java中的Map
    Java的PriorityQueue
    Java中的List
    Java中的Set
  • 原文地址:https://www.cnblogs.com/Serene-shixinyi/p/7445396.html
Copyright © 2011-2022 走看看