NOI2009 植物大战僵尸
啊一道好题
感觉写得挺爽的啊这题
这种有一点懵逼然后学了一点东西之后很明朗的感觉真是好!
预处理参考 :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 植物大战僵尸的更多相关文章
- 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸
410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:pvz.out 简单对比时间限制:2 s 内存限制:512 MB [问题描述] Plants vs ...
- P2805 [NOI2009]植物大战僵尸
题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...
- COGS410. [NOI2009] 植物大战僵尸
410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:pvz.out 简单对比时间限制:2 s 内存限制:512 MB [问题描述] Plants vs ...
- BZOJ 1565: [NOI2009]植物大战僵尸
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2317 Solved: 1071[Submit][Stat ...
- 【刷题】BZOJ 1565 [NOI2009]植物大战僵尸
Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻. ...
- 【bzoj1565】[NOI2009]植物大战僵尸
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2164 Solved: 1001[Submit][Stat ...
- 【最大权闭合子图 tarjan】bzoj1565: [NOI2009]植物大战僵尸
dinic+tarjan板子练手题 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其 中P ...
- BZOJ1565: [NOI2009]植物大战僵尸
Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...
- 【bzoj1565】 NOI2009—植物大战僵尸
http://www.lydsy.com/JudgeOnline/problem.php?id=1565 (题目链接) 题意 给出$n*m$的棋盘,僵尸攻击每个格子可以获得$v$的分数,每个格子又会保 ...
- luogu2805 [NOI2009]植物大战僵尸
想象一下,要搞掉一个植物,必须先搞掉另一些植物--我们可以发现这是一个最大权闭合子图的问题. 最大权闭合子图的话,太空飞行计划问题是一个入门题,可以一看. 然而我们手玩一下样例就会惊恐地发现,保护关系 ...
随机推荐
- c语言的枚举(遍历枚举)与数据类型总结
一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型. 比如,你可以用一个枚举类型的变量来表示季节, ...
- c语言贪吃蛇详解1.画出地图
c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...
- c#统计代码行数
小编,已经快学了两年编程了.昨天突发奇想,想统计下这些年到底写过多少行代码,于是做了一个这个小程序来统计代码行数.老规矩,先上图. 比较惭愧,写了两年只有2万多行.那我们还是进入下一项吧. 界面搭建我 ...
- MySQL管理员珍藏:十大必备工具盘点
作者:dongdongzzcs 第1页: [IT168 专稿]本文的作者Daniel Nichter是MySQL工具的开发者,他为MySQL管理员推荐了十款必备工具.以下是全文内容: MySQL是一套 ...
- .NET作品集:linux下的博客程序
博客程序架构 本博客程序是博主11年的时候参考loachs小泥鳅博客内核开发的.net跨平台博客cms,距今已有6年多了,个人博客网站一直在用,虽然没有wordpress那么强大,但是当时在深究.ne ...
- 洛谷教主花园dp
洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价 ...
- Oracle 每天自动生成AWR报告
经验丰富的老员工希望能够每天为数据库生成1个AWR报告,以便于后期分析数据库的性能变化,手动生成太麻烦,查了一下资料,发现可以自动生成,过程如下. 数据库环境:11gR2 RAC(双节点) AWR报告 ...
- 安卓图片加载框架之Glide框架
Glide框架加载有两种,第一,是加载图片,第二是加载布局背景.首先我来说说第一种情况加载图片. Glide.with(getActivity()).load(lists.get(position). ...
- sqlserver2005公布与订阅配置步骤
1,新建公布 前提条件:第一要调通网络,在sqlserver configuration manager 中选择mssqlserver的协议把named pipes改为启用.第二要建立一个目录D:\b ...
- iOS 读书笔记-国际化
吐槽一下:国际化-我想说学习的这个project好痛苦. 也许是百度的原因,总是不能找到自己想要东西. 找到的内容不是不具体就是时间有点久了.让我这种小白非常头痛. 以下记录一下整个过程. 国际化是什 ...