我: “立个flag 14点之前调完这题”

洛谷AC时间: 2019-06-24 14:00:16

实力打脸。。。

网络流板子从来写不对系列

题目链接: (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=1565

(luogu) https://www.luogu.org/problemnew/show/P2805

题解: 长得就那么像个最大权闭合子图啊。。。

\(i\)攻击\(j\)相当于如果想吃掉\(i\)必须吃掉\(j\), 另外如果吃掉\(i\)必须吃掉\(i\)右侧的点,最大权闭合子图。

但是可能有环,注意环并非要么全吃要么全不吃而是全都不能吃,所以用Tarjan提前判一下环,在环里的点和\(T\)连\(+\inf\)表示不能吃

时间复杂度\(O(MaxFlow(nm,(nm)^2))\).

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;const int N = 602;
const int M = 362400;
const int INF = 1e8;namespace MaxFlow
{struct Edge{int v,w,nxt,rev;} e[(M<<1)+3];int fe[N+3];int te[N+3];int dep[N+3];int que[N+3];int n,en;void addedge(int u,int v,int w){en++; e[en].v = v; e[en].w = w;e[en].nxt = fe[u]; fe[u] = en; e[en].rev = en+1;en++; e[en].v = u; e[en].w = 0;e[en].nxt = fe[v]; fe[v] = en; e[en].rev = en-1;}bool bfs(){for(int i=1; i<=n; i++) dep[i] = 0;int head = 1,tail = 1; que[tail] = 1; dep[1] = 1;while(head<=tail){int u = que[head]; head++;for(int i=fe[u]; i; i=e[i].nxt){if(dep[e[i].v]==0 && e[i].w>0){dep[e[i].v] = dep[u]+1;tail++; que[tail] = e[i].v;}}}return dep[2]!=0;}int dfs(int u,int cur){if(u==2) {return cur;}int rst = cur;for(int i=te[u]; i; i=e[i].nxt){if(dep[e[i].v]==dep[u]+1 && e[i].w>0 && rst>0){int flow = dfs(e[i].v,min(rst,e[i].w));if(flow>0){e[i].w-=flow; e[e[i].rev].w += flow; rst-=flow;if(e[i].w>0) {te[u] = i;}if(rst==0) {return cur;}}}}if(cur==rst) {dep[u] = 0;}return cur-rst;}int dinic(int _n){n = _n;int ret = 0;while(bfs()){for(int i=1; i<=n; i++) te[i] = fe[i];ret += dfs(1,INF);}return ret;}
}namespace Tarjan
{struct Edge{int v,nxt;} e[M+3];int fe[N+3];int dfn[N+3],low[N+3],stk[N+3];bool instk[N+3];bool inscc[N+3];int n,en,cnt,tp;void addedge(int u,int v){en++; e[en].v = v;e[en].nxt = fe[u]; fe[u] = en;}void dfs(int u){cnt++; dfn[u] = low[u] = cnt; tp++; stk[tp] = u; instk[u] = true;for(int i=fe[u]; i; i=e[i].nxt){if(!dfn[e[i].v]){dfs(e[i].v);low[u] = min(low[u],low[e[i].v]);}else if(instk[e[i].v]){low[u] = min(low[u],low[e[i].v]);}}if(low[u]>=dfn[u]){if(stk[tp]!=u) {inscc[u] = true;}while(stk[tp]!=u){inscc[stk[tp]] = true;instk[stk[tp]] = false;stk[tp] = 0; tp--;}stk[tp] = 0; tp--; instk[u] = false;}}void work(int _n){n = _n;for(int i=1; i<=n; i++){if(!dfn[i]) {dfs(i);}}}
}int n,m;int getid(int x,int y) {return x*m+y+3;}int main()
{scanf("%d%d",&n,&m); int ans = 0;for(int i=1; i<=n*m; i++){int x; scanf("%d",&x);if(x>0) {MaxFlow::addedge(1,i+2,x); ans += x;}else if(x<0) {MaxFlow::addedge(i+2,2,-x);}scanf("%d",&x);while(x--){int y,z; scanf("%d%d",&y,&z); int pos = getid(y,z);MaxFlow::addedge(pos,i+2,INF);Tarjan::addedge(pos-2,i);}if(i%m!=0){MaxFlow::addedge(i+2,i+3,INF);Tarjan::addedge(i,i+1);}}Tarjan::work(n*m);for(int i=1; i<=n*m; i++){if(Tarjan::inscc[i]){MaxFlow::addedge(i+2,2,INF);}}int tmp = MaxFlow::dinic(n*m+2);ans -= tmp;printf("%d\n",ans);return 0;
}

BZOJ 1565 Luogu P2805 [NOI2009]植物大战僵尸 (Tarjan判环、最小割)相关推荐

  1. BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)

    BZOJ 3218 UOJ #77 A+B Problem (主席树.最小割) 大名鼎鼎的A+B Problem, 主席树优化最小割-- 调题死活调不对,一怒之下改了一种写法交上去A了,但是改写法之后 ...

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

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

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

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

  4. BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2140 是 hydro 的 BZOJ ...

  5. BZOJ 1266: [AHOI2006]上学路线route Floyd算法,网络最小割

    Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可: ...

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

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

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

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

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

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

  9. 【蓝桥杯官网试题 - 历届试题】发现环(dfs+并查集,或无向图tarjan判环,无向环,或拓扑排序)

    题干: 问题描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员 ...

最新文章

  1. uc浏器保存html,UC浏览器不能保存历史记录
  2. 【LeetCode】【数组】题号:73,矩阵置零
  3. 微软收缩nano服务器容器图像,微软将推出全新服务器操作系统:Nano Server
  4. java 打印堆栈_Java打印完整的堆栈信息
  5. 良心安利东方 rpg游戏制作大师素材网站
  6. 互联网晚报 | 1月4日 星期二 | 中国移动1月5日在上交所上市;元旦档总票房破10亿;特斯拉连续6个季度交付量创纪录...
  7. python课程设计矩阵对角线之和_Python二维数组实现求出3*3矩阵对角线元素的和示例...
  8. java存储张三李四_JAVA_day14_面向对象的特征
  9. PLDA宣布XpressLINK-SOC™ CXL控制器IP支持AMBA CXS Issue B协议
  10. 浅谈软件测试行业的前景,就业方向和薪资待遇
  11. 500000服务器响应错误,加载资源失败:服务器响应状态为500(内部服务器错误)Django...
  12. Java面向对象 继承,super,方法重写
  13. 国内浏览器厂商如何抢夺IE的市场份额
  14. 米家扫地机器人沒有系统重置键_小米扫地机重置系统的作用?小米扫地机器人按键布局及功能介绍...
  15. php获取当前网页连接失败,获取连接失败:php_network_getaddresses:getaddrinfo failed:名称或服务未知...
  16. 2022年危险化学品生产单位安全生产管理人员特种作业证考试题库模拟考试平台操作
  17. 将十六进制参数转换成点分十进制 -- 将点分十进制参数转换成十六进制
  18. jQuery实现一个农场小游戏
  19. 达内java学习day13+day14
  20. keil5下载安装教程(附带兼容keil4方法)

热门文章

  1. 周志华《机器学习》课后习题(第三章):线性模型
  2. Javascript中“==”与“===”的区别
  3. 用SQL语句添加删除修改字段及一些表与字段的基本操作 .
  4. 将FORMSTYLE类型由FSNORMAL变为FSMDICHILD时,窗体的VISIBLE自动设为TRUE.且create之后,自动运行onshow事件。
  5. 数据库记录的添加、修改、删除(DataAdapter、DataTable 、DataRow )
  6. 汇编OFFSET,SEG,LEA
  7. main() 函数解析(一)——Linux-0.11 剖析笔记(六)
  8. shardingsphere启动的时候报错Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required
  9. 【译】Diving Into The Ethereum VM Part 2 — How I Learned To Start Worrying And Count The Storage Cost
  10. 将一个指针 free 两次之后会发生什么?