题目

Source

http://www.lydsy.com/JudgeOnline/problem.php?id=1565

Description

Input

Output

仅包含一个整数,表示可以获得的最大能源收入。注意,你也可以选择不进行任何攻击,这样能源收入为0。

Sample Input

3 2
10 0
20 0
-10 0
-5 1 0 0
100 1 2 1
100 0

Sample Output

25

分析

题目大概说n*m的格子上有植物,僵尸从某行最右边开始进攻,消除各个植物有正收益或负收益,消除一个植物要先消除它右边的植物,有些植物消除要先消除其他植物,问能获得的最大收益是多少。

两种先后关系建图,对于出现环的忽略,其余的其实就是最大权闭合子图了,这个可以通过拓扑排序的过程来建容量网络。。

代码

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define INF (1<<30)
#define MAXN 666
#define MAXM 666*666*2struct Edge{int v,cap,flow,next;
}edge[MAXM];
int vs,vt,NE,NV;
int head[MAXN];void addEdge(int u,int v,int cap){edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=0;edge[NE].next=head[u]; head[u]=NE++;edge[NE].v=u; edge[NE].cap=0; edge[NE].flow=0;edge[NE].next=head[v]; head[v]=NE++;
}int level[MAXN];
int gap[MAXN];
void bfs(){memset(level,-1,sizeof(level));memset(gap,0,sizeof(gap));level[vt]=0;gap[level[vt]]++;queue<int> que;que.push(vt);while(!que.empty()){int u=que.front(); que.pop();for(int i=head[u]; i!=-1; i=edge[i].next){int v=edge[i].v;if(level[v]!=-1) continue;level[v]=level[u]+1;gap[level[v]]++;que.push(v);}}
}int pre[MAXN];
int cur[MAXN];
int ISAP(){bfs();memset(pre,-1,sizeof(pre));memcpy(cur,head,sizeof(head));int u=pre[vs]=vs,flow=0,aug=INF;gap[0]=NV;while(level[vs]<NV){bool flag=false;for(int &i=cur[u]; i!=-1; i=edge[i].next){int v=edge[i].v;if(edge[i].cap!=edge[i].flow && level[u]==level[v]+1){flag=true;pre[v]=u;u=v;//aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));aug=min(aug,edge[i].cap-edge[i].flow);if(v==vt){flow+=aug;for(u=pre[v]; v!=vs; v=u,u=pre[u]){edge[cur[u]].flow+=aug;edge[cur[u]^1].flow-=aug;}//aug=-1;aug=INF;}break;}}if(flag) continue;int minlevel=NV;for(int i=head[u]; i!=-1; i=edge[i].next){int v=edge[i].v;if(edge[i].cap!=edge[i].flow && level[v]<minlevel){minlevel=level[v];cur[u]=i;}}if(--gap[level[u]]==0) break;level[u]=minlevel+1;gap[level[u]]++;u=pre[u];}return flow;
}vector<int> G[MAXN];
int score[MAXN],deg[MAXN];int main(){int n,m,a,b,c;scanf("%d%d",&n,&m);for(int i=0; i<n*m; ++i){scanf("%d",&score[i]);scanf("%d",&c);while(c--){scanf("%d%d",&a,&b);G[i].push_back(a*m+b);++deg[a*m+b];}if(i%m){G[i].push_back(i-1);++deg[i-1];}}vs=n*m; vt=vs+1; NV=vt+1; NE=0;memset(head,-1,sizeof(head));int tot=0;queue<int> que;for(int i=0; i<vs; ++i){if(deg[i]==0) que.push(i);}while(!que.empty()){int u=que.front(); que.pop();if(score[u]<0){addEdge(u,vt,-score[u]);}else{addEdge(vs,u,score[u]);tot+=score[u];}for(int i=0; i<G[u].size(); ++i){int v=G[u][i];--deg[v];if(deg[v]==0) que.push(v);addEdge(v,u,INF);}}printf("%d",tot-ISAP());return 0;
}

转载于:https://www.cnblogs.com/WABoss/p/5927934.html

BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)相关推荐

  1. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图

    原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...

  2. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】

    一上来以为是裸的最大权闭合子图,上来就dinic -然后没过样例.不得不说样例还是非常良心的给了一个强连通分量,要不然就WA的生活不能自理了 然后注意到有一种特殊情况:每个植物向他保护的植物连边(包括 ...

  3. BZOJ1565[NOI2009]植物大战僵尸——最大权闭合子图+拓扑排序

    题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻.该款游戏包含多 ...

  4. P2805-[NOI2009]植物大战僵尸【网络流,最大权闭合图】

    正题 题目链接:https://www.luogu.com.cn/problem/P2805 题目大意 n∗mn*mn∗m的格子,攻击这个格子(x,y)(x,y)(x,y)可以获得价值cx,yc_{x ...

  5. 【bzoj1565】[NOI2009]植物大战僵尸 【网络流】【最大权闭合子图】

    题解:可以看出每个格子有一些前驱,只有前驱都被消灭了才能走到这里.因为要求最大的权值和,所以我们可以用最大权闭合子图来求解这题.最大权闭合子图点这里! 然后让蒟蒻讲一讲自己掉的坑. 首先,根据WYC大 ...

  6. BZOJ1565:[NOI2009]植物大战僵尸——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1565 https://www.luogu.org/problemnew/show/P2805 Pla ...

  7. BZOJ 1565 Luogu P2805 [NOI2009]植物大战僵尸 (Tarjan判环、最小割)

    我: "立个flag 14点之前调完这题" 洛谷AC时间: 2019-06-24 14:00:16 实力打脸... 网络流板子从来写不对系列 题目链接: (BZOJ) https: ...

  8. 网络流 - 最大权闭合子图 [NOI2009]植物大战僵尸

    算法思想概述 本题是一道最大权闭合子图模型,应用的算法为最大流(BFS增广即可),定理为最大流最小割定理,辅助算法为拓扑排序. 问题初始建模 首先我们我建立图论模型,把每个植物当做一个顶点,植物携带的 ...

  9. poj 2987 Firing【最大权闭合子图+玄学计数 || BFS】

    玄学计数 LYY Orz 第一次见这种神奇的计数方式,乍一看非常不靠谱但是仔细想想还卡不掉 就是把在建图的时候把正权变成w*10000-1,负权变成w*10000+1,跑最大权闭合子图.后面的1作用是 ...

  10. 最大权闭合子图(最小割)

    最大权闭合子图(最大流最小割) •参考资料 [1]最大权闭合子图 •权闭合子图 存在一个图的子图,使得子图中的所有点出度指向的点依旧在这个子图内,则此子图是闭合子图. 在这个图中有8个闭合子图:∅,{ ...

最新文章

  1. XAML Region标签功能
  2. JQuery判断radio是否选中,获取选中值
  3. PWN-PRACTICE-BUUCTF-30
  4. Redis:04---键的基本命令(上)
  5. 一篇文章搞懂架构师的核心技能
  6. Facebook泄露隐私算什么?国内一次外卖,竟让4万用户全“裸着”
  7. python Django ORM ,用filter方法表示“不等于”的方法
  8. 使用celery执行Django串行异步任务
  9. Go 神坑 1 —— interface{} 与 nil 的比较
  10. 每天一道算法题(10)——数对之差的最大值
  11. [Curator] Leader Latch 的使用与分析
  12. 华为路由器内部服务器地址映射不起作用,第一次买华为AR2204-s路由,内部服务器映射问题...
  13. 【2019】【论文笔记】基于混合石墨烯金属结构的可重构THz Vivaldi天线——
  14. 人工智能与商业智能,区别、定位与联系
  15. 英语音乐---三、Cry on my shoulder
  16. 人工神经网络的训练步骤,神经网络训练过程图解
  17. anemometer mysql_十分钟部署Anemometer作为Mysql慢查询可视化系统
  18. 设计模式——行为型模式_观察者模式/发布-订阅模式
  19. 【MySQL异常】Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNA
  20. 在Windows设置里改不了默认浏览器

热门文章

  1. webpack核心提炼
  2. WPF备忘录(7)WPF图片资源路径介绍
  3. USACO 2016 January Contest, Gold解题报告
  4. VS2010+OpenCV2.4.9配置
  5. Android推送方案分析(MQTT/XMPP/GCM)
  6. getifaddrs
  7. 利用WebUtil删除Cookies
  8. 单一世界十万在线webgame的设计思路(五)-- 整体架构和总结
  9. 做创业公司长期价值的共建者,高榕资本完成5亿美元新基金募资
  10. springmvc获取url对应的controller,并拦截记录每次访问的controller方法