[luoguP2805] [NOI2009]植物大战僵尸(网络流)
结论:这是最大权闭合图的模型
因为可能A保护B,B保护A,出现环。
所以由植物A向植物A保护的植物连边,然后拓扑排序,将环去掉。
然后将拓扑排序的边反向连,建立最大权闭合图的模型。
跑最大流(最小割),用正权边之和-最小割即为答案
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#define N 1000001
#define id(i, j) ((i - 1) * m + j) using namespace std; int n, m, s, t, T, cnt, sum;
int head[N], to[N], nex[N], val[N], a[N], dis[N], cur[N], d[N];
vector <int> vec[N];
queue <int> q; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline void add(int x, int y, int z)
{
to[cnt] = y;
val[cnt] = z;
nex[cnt] = head[x];
head[x] = cnt++;
} inline bool bfs()
{
int i, u, v;
memset(dis, -1, sizeof(dis));
while(!q.empty()) q.pop();
q.push(s);
dis[s] = 0;
while(!q.empty())
{
u = q.front();
q.pop();
for(i = head[u]; ~i; i = nex[i])
{
v = to[i];
if(val[i] && dis[v] == -1)
{
dis[v] = dis[u] + 1;
if(v == t) return 1;
q.push(v);
}
}
}
return 0;
} inline int dfs(int u, int maxflow)
{
if(u == t) return maxflow;
int v, f, used = 0;
for(int &i = cur[u]; ~i; i = nex[i])
{
v = to[i];
if(val[i] && dis[v] == dis[u] + 1)
{
f = dfs(v, min(val[i], maxflow - used));
used += f;
val[i] -= f;
val[i ^ 1] += f;
if(used == maxflow) return maxflow;
}
}
return used;
} inline int dinic()
{
int i, ret = 0;
while(bfs())
{
for(i = s; i <= t; i++) cur[i] = head[i];
ret += dfs(s, 1e9);
}
return ret;
} int main()
{
int i, j, u, v, x, y;
n = read();
m = read();
s = 0, t = n * m + 1;
memset(head, -1, sizeof(head));
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
{
a[id(i, j)] = read();
if(j > 1)
{
d[id(i, j - 1)]++;
vec[id(i, j)].push_back(id(i, j - 1));
}
T = read();
while(T--)
{
x = read() + 1;
y = read() + 1;
d[id(x, y)]++;
vec[id(i, j)].push_back(id(x, y));
}
}
for(i = 1; i <= n * m; i++)
if(!d[i]) q.push(i);
while(!q.empty())
{
u = q.front();
q.pop();
for(i = 0; i < vec[u].size(); i++)
if(!(--d[vec[u][i]])) q.push(vec[u][i]);
}
for(u = 1; u <= n * m; u++)
if(!d[u])
{
if(a[u] > 0) add(s, u, a[u]), add(u, s, 0), sum += a[u];
if(a[u] < 0) add(u, t, -a[u]), add(t, u, 0);
for(i = 0; i < vec[u].size(); i++)
{
v = vec[u][i];
if(!d[v]) add(v, u, 1e9), add(u, v, 0);
}
}
printf("%d\n", sum - dinic());
return 0;
}
[luoguP2805] [NOI2009]植物大战僵尸(网络流)的更多相关文章
- BZOJ 1565 [NOI2009]植物大战僵尸 | 网络流
传送门 BZOJ 1565 题解 这道题也是个经典的最大权闭合子图-- 复习一下最大权闭合子图是什么? 就是一个DAG上,每个点有个或正或负的点权,有的点依赖于另外一些点(如果选这个点,则被依赖点必选 ...
- [BZOJ1565][NOI2009]植物大战僵尸-[网络流-最小割+最大点权闭合子图+拓扑排序]
Description 传送门 Solution em本题知识点是用网络流求最大点权闭合子图. 闭合图定义:图中任何一个点u,若有边u->v,则v必定也在图中. 建图:运用最小割思想,将S向点权 ...
- 洛谷$P2805\ [NOI2009]$植物大战僵尸 网络流
正解:网络流 解题报告: 传送门$QwQ$ 题面好长昂,,,我大概概括下$QwQ$?有个$n\cdot m$的网格,每个格子有一株植物,击溃一株植物$(x,y)$需要付出$S_{(x,y)}$的代价( ...
- [NOI2009] 植物大战僵尸 [网络流]
题面: 传送门 思路: 这道题明显可以看出来有依赖关系 那么根据依赖(保护)关系建图:如果a保护b则连边(a,b) 这样,首先所有在环上的植物都吃不到,被它们间接保护的也吃不到 把这些植物去除以后,剩 ...
- BZOJ 1565: [NOI2009]植物大战僵尸(网络流+缩点)
传送门 解题思路 最大权闭合子图.但是要注意一些细节,假如有一堆植物形成一个环,那么这些植物都是无敌的,并且他们保护的植物是无敌的,他们保护的保护的植物是无敌 的.所以要缩点,然后拓扑排序一次判无敌, ...
- bzoj 1565 [NOI2009]植物大战僵尸 解题报告
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2161 Solved: 1000[Submit][Stat ...
- Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序
题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:p ...
- BZOJ 1565: [NOI2009]植物大战僵尸( 最小割 )
先拓扑排序搞出合法的, 然后就是最大权闭合图模型了.... --------------------------------------------------------------------- ...
- b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图
b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...
随机推荐
- 关于搭建系统直播和Thinkphp的杂谈(持续更新)
Q:Access denied for user 'root'@'localhost' 错误 A:第一种:配置文件中把数据库的用户名密码再改一遍,把runtime里的文件删除 第二种:修改syste ...
- 使用Cordova将您的前端JavaScript应用打包成手机原生应用
假设我用JavaScript和HTML开发了一个前端应用,我想把该应用打包成能直接在手机上安装和运行(不通过浏览器)的原生应用,例如像下面这样.对应用的用户来说,他们得到的用户体验和真正的用Andro ...
- 字符串赋值方式理解 sizeof 和strlen的一些区别
#include<stdio.h>#include<string.h> int main(){ int a,i=0; char ch[10000]; while(scanf( ...
- MAC 安装汇编编译工具 NASM
直接运行nasm报错: 开始安装: brew reinstall nasm
- C++类型强制转换<转>
转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型 ...
- 来自-小坦克:Fiddler教程
Fiddler 教程 阅读目录 Fiddler的基本介绍 Fiddler的工作原理 同类的其它工具 Fiddler如何捕获Firefox的会话 Fiddler如何捕获HTTPS会话 Fiddler的基 ...
- nodeJS进程管理器pm2
pm2是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. PM2是开源的基于Nodejs的进程管 ...
- 关于jQuery中的$发生冲突及解决方案
问题描述: 在Jquery库中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg')的写法. 当引入多个js库后,其它的js库 ...
- Bootstrap 基本按钮
本章将通过实例讲解如何使用Bootstrap按钮,任何带有class.btn的元素都会继承圆角灰色默认按钮样式,但Bootstrap提供了一些选项来定义按钮的样式. 实例 <!DOCTYPE h ...
- (转发)IOS高级开发~Runtime(一)
IOS高级开发-Runtime(一) IOS高级开发-Runtime(二) IOS高级开发-Runtime(三) IOS高级开发-Runtime(四) 一些公用类: @interface Custom ...