[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个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...
随机推荐
- rxjava封装,RxBus封装(上线项目集成,声明周期管理,处理溢出内存,支持同时多个请求。)
Github地址 RxLibrary工程:1.rxjava2 + retrofit2的封装,常用的请求(Get,Post,文件上传,文件下载),防止内存泄漏,简单便捷,支持自定义loading等属性. ...
- sql 函数 coalesce
SQL函数 coalesce 功能: 返回参数中第一个非null的值. 语法: coalesce(参数1,参数2,参数3,...);返回第一个非null的值. 一般情况下会与Nullif()函数一起使 ...
- POJ 3107 Godfather (树的重心)
题意:求树的重心,若有多个,全部打印出来. 思路: 树的重心:在删除点v后,森林中的每棵树的节点数尽量均匀,若最大的那棵树的节点数最小,称v为树的重心. 这道题只是求树的所有重心,当且经当这棵树有对称 ...
- jni 修bug
1. ReferenceTable overflow (max=512) 内存泄露,程序运行一段时间就挂掉了. 在利用反射调用java中的函数需要释放掉查找到的类 void publishJava ...
- a标签目标链接问题
1.先确定开始文件和目标文件,例如从css.html开始到body.html 2.确定文件寻找路径,因为css.html的父目录是css,而body.html在body目录下,所以需要先退到上一目录h ...
- tomcat性能优化 - 网络抄录
tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈. tomcat内存优化 linux修改TOMCAT_HOME/bin/catalina.s ...
- shell脚本,如何写进度条。
[root@localhost ~]# cat jindutiao.sh #!/bin/bash #进度条 n=$((/)) N=$((/)) ` do sleep 0.01 [ $(($i%$n)) ...
- 初涉trie
trie:字符串算法中的重要“数据结构” 什么是trie trie就是利用字符串的公共前缀所建成的树. 众所周知树是有很多很好的性质的,于是trie可以结合其他知识点做一些有趣的事情. trie的例题 ...
- linux运维中常用的指令
一.终端中常用的快捷键 man界面中的快捷键: ?keyword 向上搜索关键词keyword,n向下搜索,N继续向上搜索 /keyword 向下搜索关键词keyw ...
- 前端Web框架的实现过程
一.Web框架的本质: 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 i ...