啊一道好题
感觉写得挺爽的啊这题
这种有一点懵逼然后学了一点东西之后很明朗的感觉真是好!
预处理参考 :http://www.cppblog.com/MatoNo1/archive/2014/11/01/142798.html?opt=admin
建图参考 :http://hihocoder.com/problemset/problem/1398?sid=1010444

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#define N 80000
#define mod
#define inf 300000000
#define rg register
using namespace std;
typedef long long ll;
int n,m,tot=0,cnt=0,tmp=0,s,t;
int dis[N],hd[N],head[N],c[N],in[N],d[(N<<3)],w[N];
bool del[N];
struct hh{
	int to,nxt,w;
}b1[N*100],b[N*100];
int p (int x,int y) { return (x-1)*m+y; }
void link(int x,int y,int w){
	b1[tot].nxt=hd[x];
	b1[tot].to=y;
	b1[tot].w=w;
	hd[x]=tot++;
}
void lnk(int x,int y,int w){
	b[tot].nxt=head[x];
	b[tot].to=y;
	b[tot].w=w;
	head[x]=tot++;
}
void dele(int x){
	del[x]=1;
	for (int i=hd[x];i!=-1;i=b1[i].nxt)
		if (!del[b1[i].to]) dele(b1[i].to);
}
void top(){
	int h=0,t=0;
	for (int i=1;i<=cnt;++i){
		if (!in[i]) d[++t]=i;
		else del[i]=1;
	}
	while (h<=t){
		int x=d[++h];
		for (int i=hd[x];i!=-1;i=b1[i].nxt){
			in[b1[i].to]--,del[b1[i].to]=0;
			if (!in[b1[i].to]) d[++t]=b1[i].to;
		}
	}
	for (int i=1;i<=cnt;++i) if (del[i]) dele(i);
}
bool bfs(){
	queue <int> q;
	memset(dis,-1,sizeof(dis));
	q.push(s);dis[s]=0;
	while (!q.empty()){
		int h=q.front();
		q.pop();
		for (int i=head[h];i!=-1;i=b[i].nxt){
			int v=b[i].to;
			if (dis[v]!=-1||b[i].w<=0) continue;
			dis[v]=dis[h]+1;
			if (v==t) return 1;
			q.push(v);
		}
	}
	return dis[t]==-1?0:1;
}
int dfs(int u,int f){
	if (u==t||!f) return f;
	int res=f;
	for (int &i=c[u];i!=-1;i=b[i].nxt){
		int v=b[i].to;
		if (dis[v]!=dis[u]+1||b[i].w<=0) continue;
		int d=dfs(v,min(res,b[i].w));
		b[i].w-=d,b[i^1].w+=d;
		res-=d;
		if (res<=0) break;
	}
	return f-res;
}
int dinic(){
	int ans=0;
	while (bfs()){
		for (int i=s;i<=t;++i) c[i]=head[i];
		ans+=dfs(s,inf);
	}
	return ans;
}
int main(){
	freopen ("pvz.in","r",stdin);
	freopen ("pvz.out","w",stdout);
	memset(hd,-1,sizeof(hd));
	memset(head,-1,sizeof(head));
	scanf ("%d%d",&n,&m);
	int x,y,z;
	for (int i=1;i<=n;++i)
		for (int j=1;j<=m;++j){
			scanf ("%d%d",&w[p(i,j)],&z);
			for (int k=1;k<=z;++k) scanf ("%d%d",&x,&y),link(p(i,j),p(x+1,y+1),0),in[p(x+1,y+1)]++;
		}
	for (int i=1;i<=n;++i)
		for (int j=2;j<=m;++j) link(p(i,j),p(i,j-1),0),in[p(i,j-1)]++;
	cnt=n*m;
	top();
	s=0,t=cnt+1,tmp=0;
	tot=0;
	for (int i=1;i<=cnt;++i){
		if (del[i]) continue;
		if (w[i]>0) tmp+=w[i],lnk(i,t,w[i]),lnk(t,i,0);
		else lnk(s,i,-w[i]),lnk(i,s,0);
		for (int j=hd[i];j!=-1;j=b1[j].nxt)
			if (!del[b1[j].to]) lnk(i,b1[j].to,inf),lnk(b1[j].to,i,0);
	}
	tmp-=dinic();
	printf ("%d\n",max(0,tmp));
	return 0;
}

  

NOI2009 植物大战僵尸的更多相关文章

  1. 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

  2. P2805 [NOI2009]植物大战僵尸

    题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...

  3. COGS410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

  4. BZOJ 1565: [NOI2009]植物大战僵尸

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2317  Solved: 1071[Submit][Stat ...

  5. 【刷题】BZOJ 1565 [NOI2009]植物大战僵尸

    Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻. ...

  6. 【bzoj1565】[NOI2009]植物大战僵尸

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2164  Solved: 1001[Submit][Stat ...

  7. 【最大权闭合子图 tarjan】bzoj1565: [NOI2009]植物大战僵尸

    dinic+tarjan板子练手题 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其 中P ...

  8. BZOJ1565: [NOI2009]植物大战僵尸

    Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...

  9. 【bzoj1565】 NOI2009—植物大战僵尸

    http://www.lydsy.com/JudgeOnline/problem.php?id=1565 (题目链接) 题意 给出$n*m$的棋盘,僵尸攻击每个格子可以获得$v$的分数,每个格子又会保 ...

  10. luogu2805 [NOI2009]植物大战僵尸

    想象一下,要搞掉一个植物,必须先搞掉另一些植物--我们可以发现这是一个最大权闭合子图的问题. 最大权闭合子图的话,太空飞行计划问题是一个入门题,可以一看. 然而我们手玩一下样例就会惊恐地发现,保护关系 ...

随机推荐

  1. params SqlParameter[] commandParameters(转)

    C#代码  ExecuteReader(string connectionString, CommandType commandType, string commandText, params Sql ...

  2. ASP.NET Core 一步步搭建个人网站(持续更新中~~~)

    摘要 ASP.NET Core2.0发布有一阵子了,这是.NET 开源跨平台的一个重大里程碑, 也意味着比1.0版本要更加成熟.目前.net core具有开源.跨平台.灵活部署.模块化架构等等特性,吸 ...

  3. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十一)redis密码设置、安全设置

    警惕 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作>主要是一个简单的介绍,针对redis ...

  4. VMware12提示 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。

    VMware12提示 已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态 解决办法: 下载LeoM ...

  5. 32位linux(centos)下mongoDB的安装

    下载mongoDB wget http://downloads.mongodb.org/linux/mongodb-linux-i686-2.4.9.tgz 如果上面地址不对可以去官网自己下载http ...

  6. eclipse修改内存大小

    一般安装完eclipse之后,在安装目录下你应该可以看到有一个 eclipse.ini 文件,对了,就是在这个文件里面修改,我打开同事机器上这个文件,里面的内容是: -vmargs-Dosgi.spl ...

  7. Jdk8的学习之lambda

    在JDK8中,引入了Lambda(读:了母达)表达式的概念,这是我最喜欢的特性,很多东西都变得简单了,一行代码可以搞定. 比如说排序 /** * 这是一个JDK8的lambda的排序应用 */ pub ...

  8. 基于iTextSharp的PDF文档操作

    公司是跨境电商,需要和各种物流打交道,需要把东西交给物流,让他们发到世界各地.其中需要物流公司提供一个运单号,来追踪货物到达哪里?! 最近在和DHL物流公司(应该是个大公司)对接,取运单号的方式是调用 ...

  9. 【NOI2015】程序自动分析

    https://www.luogu.org/problem/show?pid=1955 并查集+离散化. 先执行所有x=y问题,即合并x和y. 再依次执行所有x!=y问题,即查询x和y是否处于同一集合 ...

  10. 递归回溯 UVa140 Bandwidth宽带

    本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...