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]植物大战僵尸
想象一下,要搞掉一个植物,必须先搞掉另一些植物--我们可以发现这是一个最大权闭合子图的问题. 最大权闭合子图的话,太空飞行计划问题是一个入门题,可以一看. 然而我们手玩一下样例就会惊恐地发现,保护关系 ...
随机推荐
- javaScript(JS)强制保留两位小数的输入数校验和小数保留
参考来源于网络,如有侵权,请联系作者删除: 输入input 的格式校验: $(function(){ var data = $.trim($("#inputId").val()); ...
- 爬虫day 04(通过登录去爬虫 解决django的csrf_token)
#通过登录去爬虫 #首先要有用户名和密码 import urllib.request import http.cookiejar from lxml import etree head = { 'Co ...
- 深入浅出多线程——ReentrantLock (二)
深入浅出多线程——ReentrantLock (一)文章中介绍了该类的基本使用,以及在源码的角度分析lock().unlock()方法.这次打算在此基础上介绍另一个极为重要的方法newConditio ...
- Android测试:Testing Apps on Android
原文:https://developer.android.com/training/testing/index.html 测试你的App是开发过程中的重要组成部分.通过对应用程序持续的运行测试,你可以 ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- git上传本地文件到gitlab
The repository for this project is empty If you already have files you can push them using command l ...
- Java 面试宝典
1. 类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序 答:先静态.先父后子. 先静态:父静态 > 子静态 优先级:父类 > 子类 静态代码块 ...
- Oracle在本地调试成功读取数据,但是把代码放到服务器读不出数据的解决方法。
用MVC EF框架开发项目,数据库用的是Oracle,本地调试的时候一切正常,但是把代码编译之后放到服务器就会读不出数据. 原因:本地调试环境与服务器环境不一致. 办法:在服务器上装ODT.NET组件 ...
- python学习第一天基础篇
学习背景:决定开始学习python之前,因为公司基本都是微软系统,所以很少碰到linux系统,机缘巧合接到了一个项目是使用shell对mysql进行backup,因为公司唯一的系统工程师是微软在行,对 ...
- 关于前端框架BootStrap和JQueryUI(以及相应的优秀模板)
近期两个月因为须要升级公司产品的界面.所以不得不去学习了下原本并不熟悉的前端框架. 这里也是推荐两款BootStrap和JQueryUI. bootstrap使用起始非常easy,首先.须要得到所须要 ...