【TYVJ】QQ农场(最大流+最大权闭合图)

http://tyvj.cn/Problem_Show.aspx?id=1338

时间才排到rank7,还不快啊囧。isap我常数都写得那么小了。。。

最大权闭合图看我另一篇博文吧

此题很明显的模型。

首先我们先染色,使整个图黑白相间,其中我们只需要在黑色点向对应的上下左右白色节点连边,很明显,这些节点都有权值,我们需要求的是最大权,那么就按我的博文那样来做即可。

用sum-最小割就是答案。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define read(a) a=getnum()
#define print(a) printf("%d", a)
inline int getnum() { int ret=0; char c; for(c=getchar(); c<‘0‘ || c>‘9‘; c=getchar()); for(; c>=‘0‘ && c<=‘9‘; c=getchar()) ret=ret*10+c-‘0‘; return ret; }

const int N=40005, M=N*4*2, oo=~0u>>2;
int ihead[N], inext[M], from[M], to[M], cap[M], cnt=1;
int gap[N], d[N], cur[N], p[N];

inline void add(const int &u, const int &v, const int &w) {
	inext[++cnt]=ihead[u]; ihead[u]=cnt; from[cnt]=u; to[cnt]=v; cap[cnt]=w;
	inext[++cnt]=ihead[v]; ihead[v]=cnt; from[cnt]=v; to[cnt]=u; cap[cnt]=0;
}

inline int isap(const int &s, const int &t, const int &n) {
	int u=s, f, i, flow=0;
	for1(i, 0, n) cur[i]=ihead[i];
	gap[0]=n;
	while(d[s]<n) {
		for(i=cur[u]; i; i=inext[i]) if(cap[i] && d[u]==d[to[i]]+1) break;
		if(i) {
			cur[u]=i; p[to[i]]=i; u=to[i];
			if(u==t) {
				for(f=oo; u!=s; u=from[p[u]]) f=min(f, cap[p[u]]);
				for(u=t; u!=s; u=from[p[u]]) cap[p[u]]-=f, cap[p[u]^1]+=f;
				flow+=f;
			}
		}
		else {
			if(!(--gap[d[u]])) break;
			d[u]=n;
			cur[u]=ihead[u];
			for(i=ihead[u]; i; i=inext[i]) if(cap[i] && d[u]>d[to[i]]+1)
				d[u]=d[to[i]]+1;
			++gap[d[u]];
			if(u!=s) u=from[p[u]];
		}
	}
	return flow;
}

int main() {
	int t, u, n;
	read(n);
	int S=0, T=n*n+1;
	int sum=0, last;
	for1(i, 1, n) {
		last=i;
		for1(j, 1, n) {
			read(t); sum+=t;
			u=(i-1)*n+j;
			if(last%2) {
				if(i>1) add(u, u-n, oo);
				if(i<n) add(u, u+n, oo);
				if(j>1) add(u, u-1, oo);
				if(j<n) add(u, u+1, oo);
				add(S, u, t);
			}
			else add(u, T, t);
			++last;
		}
	}
	printf("%d\n", sum-isap(S, T, T+1));

	return 0;
}

【TYVJ】QQ农场(最大流+最大权闭合图),布布扣,bubuko.com

时间: 2024-12-18 11:19:38

【TYVJ】QQ农场(最大流+最大权闭合图)的相关文章

BZOJ_1497_[NOI2006]_最大获利(最大流+最大权闭合图)

描述 共n个站点,给出建立每个站点所需要的花费.现在有m个客户需要开通服务,每个客户需要有两个站点,客户给钱.问最大利润是多少. 分析 要选一个客户,就必须要选他所需的两个站点,这样有约束关系的,可以用最大权闭合图做. 胡伯涛的论文<最小割模型在信息学竞赛中的应用>: http://wenku.baidu.com/link?url=AwU_F4lYPSxxzmOrAZpL0t6lCMWjIVbuAXI59EKPbqEj7gpw0VRhhrGDU4BbOVFNGlVRt0KLZ6QrCAszJI

POJ_2987_Firing(最大流+最大权闭合图)

描述 http://poj.org/problem?id=2987 要炒员工鱿鱼,炒了一个人,他的下属一定被炒.给出每个人被炒后公司的收益(负值表示亏损),问怎样炒公司收益最大,以及这种方法炒了几个人.(先输出人数) 分析 求最大收益是用最大权闭合图.要炒一个人,他的下属也要被炒,那么边由上司连向下属,求最大权闭合图即可. 求炒了几个人实际是就是求先前求出来的那个最大权闭合图中点的个数.最大权闭合图对应的是最小割,而最小割中的边都是满流的,所以从源点出发无法到达闭合图的补集(即T),并且由于是闭

[luoguP2762] 太空飞行计划问题(最大权闭合图—最小割—最大流)

传送门 如果将每一个实验和其所对的仪器连一条有向边,那么原图就是一个dag图(有向无环) 每一个点都有一个点权,实验为收益(正数),仪器为花费(负数). 那么接下来可以引出闭合图的概念了. 闭合图是原图的一个点集,其中这个点集中每个点的出边所指向的点依然在这个点集中,那么这个点集就是个闭合图. 比如论文中的这个图: 在图 3.1 中的网络有 9 个闭合图(含空集):∅,{3,4,5},{4,5},{5},{2,4,5},{2,5},{2,3,4,5},{1,2,4,5},{1,2,3,4,5}

noi 2006 最大收益 最大权闭合图转最小割转最大流

题意:一个公司有n个可以建造通讯战的地方,建造成本分别为pi,然后第i个公司会选择使用通讯站ai与bi,使用费用是ci,然后问这个通讯公司怎么建站能够获利最大.(净获利=总收益-总成本): 网上看到一篇题解,直接说这是个最小割,求最小割然后总收益-最小割就是了.这种题解就是一点用也没有,为什么是最小割,总得解释解释吧,撂下结论就跑了,这种题解写来何用. 之后查了一篇国家集训队的论文<最小割模型在信息学竞赛中的应用>才明白原来是最大权闭合图转的最小割,至于为什么能转成最小割,自己去看论文的证明吧

tyvj P1135 - 植物大战僵尸 最大权闭合图

P1135 - 植物大战僵尸 From ytt    Normal (OI)总时限:10s    内存限制:128MB    代码长度限制:64KB 背景 Background 虽然这么多天了,,虽然寂寞的玩了好多遍植物大战僵尸,,还是觉得写题目比控制脑残僵尸比较好玩` 描述 Description 植物大战僵尸    [问题描述]Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombi

poj Firing(最大权闭合图)

Firing 题目: 要解雇一些人,而解雇的这些人如果人跟他有上下级的关系,则跟他有关系的人也要一起解雇.每个人都会创造一定的价值,要求你求出在最大的获利下,解雇的人最小. 算法分析: 在这之前要知道一个定理: 最小割 = 最大流 一道最大权闭合图的裸题,而这又可以转换成最小割来求解.证明可以看2007年胡伯涛的论文则可以直接套出模板,没看过的最好去看一下,那里解释的清楚.这里我给出他的原文的一些构造方法. 增加源s汇t 源s连接原图的正权点,容量为相应点权 原图的负权点连接汇t,容量为相应点权

BZOJ 1565 植物大战僵尸(最大权闭合图)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1565 题意:植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性:(1)价值:(2)保护集合,也就是这个植物可以保护矩阵中的某些格子.现在你是僵尸,你每次只能从(i,m) 格子进入,从右向左进攻.若一个格子是被保护的那么你是不能进入的.每进入一个格子则吃掉该格子的植物并得到其价值(价值有可能是负的).注意,每次在进 入一行后还可以再退到最右侧然后再换一行吃别的.问

HDU 3879:Base Station(最大权闭合图)

http://acm.hdu.edu.cn/showproblem.php?pid=3879 http://www.lydsy.com/JudgeOnline/problem.php?id=1497 题意:给出n个点m条边,其中每个点有一个权值代表修建这个点需要耗费的钱,然后m条边里面,代表如果两个修建好的点相连的话,那么可以得到一点利润.求最大的获利. 思路:和BZOJ 1497是同一道题目.学习最大权闭合图的题目,看了一下不清楚应该怎么建图,然后只好搜一个论文来看看.http://wenku

hdu 3879 hdu 3917 构造最大权闭合图 俩经典题

hdu3879  base station : 各一个无向图,点的权是负的,边的权是正的.自己建一个子图,使得获利最大. 一看,就感觉按最大密度子图的构想:选了边那么连接的俩端点必需选,于是就以边做点,轻轻松松构造了最大权闭合图.简单题.分分钟搞定. hdu3917 :road  constructions :这题题目看了半天没理解...感觉描述的不好...一个有向图,每条路有响应公司承保,若选了该公司,那么该公司的路必需全部选,还有,该公司的承保的路的下面的一条路对应公司也要选,求最大获利.构