[bzoj1324]Exca王者之剑_最小割

Exca王者之剑 bzoj-1324

题目大意题目链接

注释:略。



想法

最小割经典模型。

所有格子向源点连权值为格子权值的边。

将棋盘黑白染色后白点反转源汇。

如果两个格子相邻那么黑点向白点连$inf$的有向边。

求最小割即可。

开始把所有点的权值都加上,如果被割掉那么就表示这个格子不选。

Code

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define N 100010
using namespace std;
queue<int>q;
int to[N<<1],nxt[N<<1],tot=1,val[N<<1],head[N],dis[N],S,T;
int d1[]={-1,1,0,0};
int d2[]={0,0,1,-1};
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0,f=1; char c=nc(); while(c<48) {if(c==‘-‘) f=-1; c=nc();} while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x*f;}
inline void add(int x,int y,int z)
{
	to[++tot]=y; val[tot]=z; nxt[tot]=head[x]; head[x]=tot;
	to[++tot]=x; val[tot]=0; nxt[tot]=head[y]; head[y]=tot;
}
bool bfs()
{
	memset(dis,-1,sizeof dis); while(!q.empty()) q.pop();
	dis[S]=0; q.push(S); while(!q.empty())
	{
		int x=q.front(); q.pop(); for(int i=head[x];i;i=nxt[i]) if(dis[to[i]]==-1&&val[i]>0)
		{
			dis[to[i]]=dis[x]+1; q.push(to[i]);
			if(to[i]==T) return true;
		}
	}
	return false;
}
int dinic(int x,int fl)
{
	int tmp=fl; if(x==T) return fl; for(int i=head[x];i;i=nxt[i]) if(dis[to[i]]==dis[x]+1&&val[i]>0)
	{
		int mdl=dinic(to[i],min(val[i],tmp));
		if(!mdl) dis[to[i]]=-1;
		tmp-=mdl; val[i]-=mdl; val[i^1]+=mdl;
		if(!tmp) break;
	}
	return fl-tmp;
}
int main()
{
	int ans=0;
	int n=rd(),m=rd(); T=n*m+1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
	{
		int v=rd(); ans+=v;
		if((i+j)&1) add(S,(i-1)*m+j,v),add((i-1)*m+j,T,0);
		else add((i-1)*m+j,T,v),add(S,(i-1)*m+j,0);
		for(int k=0;k<4;k++)
		{
			int x=i+d1[k],y=j+d2[k];
			if(x>=1&&x<=n&&y>=1&&y<=m) ((i+j)&1)?
			(add((i-1)*m+j,(x-1)*m+y,inf)):
			(add((x-1)*m+y,(i-1)*m+j,inf));
		}
	}
	while(bfs()) ans-=dinic(S,1<<30);
	cout << ans << endl ;
	return 0;
}

小结:最小割的建模还是比较具有规律性的。

原文地址:https://www.cnblogs.com/ShuraK/p/10244113.html

时间: 2024-11-05 16:09:28

[bzoj1324]Exca王者之剑_最小割的相关文章

Bzoj1324 Exca王者之剑

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 591  Solved: 296 Description   Input 第一行给出数字N,M代表行列数.N,M均小于等于100 下面N行M列用于描述数字矩阵 Output 输出最多可以拿到多少块宝石 Sample Input 2 2 1 2 2 1 Sample Output 4 HINT Source 2007Amber国家队论文 图论 网络流 将图二分染色 求最大点权独立集 最大点权独立集就等于

POJ 3469-Dual Core CPU(网络流_最小割求容量)

PS:最小割第一发,我怎么感觉就是求最大流呢,sad.这是求最小割的容量的问题,根据最大流最小割定理,可以转换成求解网络流的最大流流量.这个事==最大流的. Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 19724   Accepted: 8562 Case Time Limit: 5000MS Description As more and more computers are equi

BZOJ_3144_[Hnoi2013]切糕_最小割

Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤P, 1≤y≤Q, 1≤z≤R). 100%的数据满足P,Q,R≤40,0≤D≤R,且给出的所有的不和谐值不超过1000. Output 仅包含一个整数,表示在合法基础上最小的总不和谐值. Sample Input 2 2 2 1 6 1 6 1 2 6 2 6 Sample O

BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割

Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献指数,(我们用Ei,j表示i经理对j经理的了解程度),即当经理i和经理j同时被雇佣时,经理i会对经理j做出贡献,使得所赚得的利润增加Ei,j.当然,雇佣每一个经理都需要花费一定的金钱Ai,对于一些经理可能他做出的贡献不值得他的花费,那么作为一个聪明的人,小L当然不会雇佣他. 然而,那些没有被雇佣的人会被竞争对手所雇佣,这个时候那些人会对你雇佣的经理的工作造成影响

[bzoj2229][Zjoi2011]最小割_网络流_最小割树

最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原图中这两点之间的最小割. 这个性质显然是非常优秀的. 我们不妨这样假设,我么已经把最小割树求出来了,那么这个题就迎刃而解了. 我们可以直接枚举点对,然后暴力验证就可以直接枚举出所有的合法点对是吧. 那么问题来了,我们如何才能求出所有的合法的点对? 这就需要用到了最小割树的构建过程. 我们最小割树的构

HDU 3046-Pleasant sheep and big big wolf(网络流_最小割)

Pleasant sheep and big big wolf Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2254    Accepted Submission(s): 946 Problem Description In ZJNU, there is a well-known prairie. And it attracts p

HDU 4859-海岸线(网络流_最小割)

海岸线 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 161    Accepted Submission(s): 90 Problem Description 欢迎来到珠海! 由于土地资源越来越紧张,使得许多海滨城市都只能依靠填海来扩展市区以求发展.作为Z市的决策人,在仔细观察了Z市地图之后,你准备通过填充某些海域来扩展Z市的海岸线

BZOJ_2001_[BeiJing2006]狼抓兔子_最小割转对偶图

BZOJ_2001_[BeiJing2006]狼抓兔子 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 分析:思路同NOI2010海拔. 注意无向图. 代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <queue> 5 using namespace std; 6 #define S

BZOJ_3894_文理分科&amp;&amp;BZOJ_2127_happiness_最小割

BZOJ_3894_文理分科_最小割 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从文科和理科中选择 一科.同学们在选择科目的时候会获得一个满意值.满意值按如下的方式 得到: 1.如果第i行第秒J的同学选择了文科,则他将获得art[i][j]的满意值,如 果选择理科,将得到science[i][j]的满意值. 2.如果第i行第J列的同