题目

我太\(zz\)了

有一个非常显然的问题就是一个植物显然能保护同一行上比它更靠后的植物,因为显然得先干掉更靠前的植物

首先可以看出来这是一个经典的最大权闭合子图的模型,于是去套最小割

发现植物的收益有正有负,于是想到正的和源点连边,负的和汇点连边

我们再来考虑一个植物没有被割掉的的状态

显然是和源点的那条边没被割掉,所以这个植物应该向保护它的植物连边,连代价为\(inf\)的边,想要保留和源点的边就必须去割掉这些连出去的边指向的植物到汇点的边

但是发现这样连样例都过不了

因为有一些植物非常神仙,自己保护自己,还有一些植物被神仙的植物保护,还有一些植物互相保护成了一个环

这些无敌的植物根本干不掉,于是不能算到最大权闭合子图里

于是我们要搞一个拓扑排序,把环里的点都给干掉

之后连边最小割就好了,记得把重边去掉

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define maxn 605
#define re register
#define LL long long
#define inf 999999999
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
struct E{int v,nxt,f,w;}e[maxn*maxn*2];
int n,m,S,T,num=1,ans,tot;
int head[maxn],d[maxn],cur[maxn];
int q[maxn],r[maxn],map[maxn][maxn];
std::vector<int> v[maxn];
std::vector<int> x[21][31],y[21][31];
int val[21][31],to[21][31];
inline void add(int x,int y,int z) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;e[num].w=z;}
inline void C(int x,int y,int z) {add(x,y,z),add(y,x,0);}
inline char gc()
{
static char buff[1000000],*S=buff,*T=buff;
return S==T&&(T=(S=buff)+fread(buff,1,1000000,stdin),S==T)?EOF:*S++;
}
inline int read()
{
char c=gc();int x=0,r=1;while(c<'0'||c>'9') {if(c=='-') r=-1;c=gc();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=gc();
return x*r;
}
inline int BFS()
{
std::queue<int> q;
for(re int i=S;i<=T;i++) d[i]=0,cur[i]=head[i];
d[S]=1,q.push(S);
while(!q.empty())
{
int k=q.front();q.pop();
for(re int i=head[k];i;i=e[i].nxt)
if(!d[e[i].v]&&e[i].w>e[i].f) d[e[i].v]=d[k]+1,q.push(e[i].v);
}
return d[T];
}
int dfs(int x,int now)
{
if(x==T||!now) return now;
int ff,flow=0;
for(re int& i=cur[x];i;i=e[i].nxt)
if(d[e[i].v]==d[x]+1)
{
ff=dfs(e[i].v,min(now,e[i].w-e[i].f));
if(ff<=0) continue;
flow+=ff,now-=ff;
e[i].f+=ff,e[i^1].f-=ff;
if(!now) break;
}
return flow;
}
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
{
val[i][j]=read();
to[i][j]=(i-1)*m+j;
if(j>1) v[to[i][j]].push_back(to[i][j-1]),r[to[i][j-1]]++;
int t=read();int X,Y;
for(re int k=0;k<t;k++) X=read()+1,Y=read()+1,x[i][j].push_back(X),y[i][j].push_back(Y);
}
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
for(re int k=0;k<x[i][j].size();k++)
{
int xx=x[i][j][k],yy=y[i][j][k];
for(re int t=1;t<=yy;t++) r[to[xx][t]]++,v[to[i][j]].push_back(to[xx][t]);
}
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
if(!r[to[i][j]]) q[++tot]=to[i][j];
for(re int i=1;i<=tot;i++)
for(re int j=0;j<v[q[i]].size();j++)
{
r[v[q[i]][j]]--;
if(!r[v[q[i]][j]]) q[++tot]=v[q[i]][j];
}
S=0,T=n*m+1;
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
{
if(r[to[i][j]]) continue;
if(val[i][j]<0) C(to[i][j],T,-1*val[i][j]);
else C(S,to[i][j],val[i][j]),ans+=val[i][j];
for(re int k=0;k<v[to[i][j]].size();k++)
if(!r[v[to[i][j]][k]]&&!map[v[to[i][j]][k]][to[i][j]])
map[v[to[i][j]][k]][to[i][j]]=1,C(v[to[i][j]][k],to[i][j],inf);
}
while(BFS()) ans-=dfs(S,inf);
printf("%d\n",ans);
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. zabbix 千台服务器自动添加实战

    一,模式   zabbix 的自动添加 主机有梁祝方式: 自动发现-----被动模式 由服务端主动发起,Zabbix Server开启发现进程,定时扫描局域网中IP服务器.设备, 自动注册----主动 ...

  2. Flask中的的SQLAlchemy

    好久没有更新Blog了 今天来聊一聊 Python 的 ORM 框架 SQLAlchemy 有的孩子已经听说过这个框架的大名了,也听说了 SQLAlchemy 没有 Django 的 Models 好 ...

  3. springMVC静态资源访问

    springMVC默认是访问不到静态资源的,如css,js等,需要在xml里进行配置 保证已经配置好了 web.xml, <!-- Spring MVC servlet --> <s ...

  4. nyoj 220——推桌子——————【贪心】

    推桌子 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 The famous ACM (Advanced Computer Maker) Company has re ...

  5. 初入门 HTML

    ---恢复内容开始--- 1.h标签(标题标签) h1~h62.br标签(换行标签) <br/>3.hr标签(水平线标签) <hr/>4.strong(加粗) em(倾斜)5. ...

  6. Zepto结合Swiper的选项卡

    我们昨天说了关于Angular的选项卡,那今天就说一下Swiper的选项卡吧! 今天的选项卡是Zepto结合Swiper的选项卡,咱么明天再说纯纯的Swiper的吧! 既然是关于Zepto和Swipe ...

  7. 关于asp.net网站中web.config的配置

    1.Session生命周期配置 2.连接默认错误页 实例说明:在一些网站中,当网络地址发生错误时,通常会自动跳转到一个页面,并在该页面显示错误信息,此功能也可以通过配置web.config文件配置实现 ...

  8. Resharper F12下载dll源码

    原作者:赵青青 原文链接:Visual Studio(VS) F12 查看DLL源代码 Dot Peek 今天在调试时,又有这个需求,想查看dll的源代码,我决定从dot peek这个程序入手去查找相 ...

  9. mac 上配置 maven

    1. 将maven压缩包解压至/Users/suqiuhui/Applications目录下的新建文件夹dev下 2. 打开终端(系统根目录,~/下) 3. 如果没有 .bash_profile 文件 ...

  10. HttpWebResponse对gzip格式返回结果的处理

    HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); HttpWebRes ...