[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个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...
随机推荐
- window.close() 关闭当前浏览器页
function eseFun() { var browserName = navigator.appName; //获取浏览器名称 if(browserName == "Netscape& ...
- SQL问题:未启用当前数据库的 SQL Server Service Broker
数据库分离后,附加回到数据库,然后在程序中打开调用数据库的页面,出现如下问题:“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数 ...
- ThreadLocal应用场景以及源码分析
一.应用篇 ThreadLocal介绍 ThreadLocal如果单纯从字面上理解的话好像是“本地线程”的意思,其实并不是这个意思,只是这个名字起的太容易让人误解了,它的真正的意思是线程本地变量. 实 ...
- JSP serverlet区别与联系
jsp是html包含java servlet是java包含html jsp请求到tomcat---tomcat封装了jsp到servlet实现. 所以jsp请求时候,会自动创建session 而不用在 ...
- iOS 查看包架构信息
lipo -info libUMSocial_Sdk_4.2.a 查看包架构信息
- sql视图和表的区别
整理一下视图和表的区别 区别: 1.视图是已经编译好了的sql,表不是 2.视图没有实际的物理存储记录,表有 3.视图是逻辑概念,表可以进行修改 5.表是内模式,视图是外模式 6.视图是我们查看表的方 ...
- tomcat假死现象(转)
1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台 ...
- spring源码学习之容器的基本实现
最近想拿出一部分时间来学习一下spring的源码,还特意买了一本书结合来看,当然主要是学习并跟着作者的思路来踏上学习spring的源码的道路,特意在此记录一下,<spring源码深度解析> ...
- MYSQL数据库SQL语句集锦
*特别说明:FILED代表数据表字段,CONDITIONS代表where之后的条件,TABLENAME代表数据表名 []中括号内的内容代表 可有可无. 创建数据库 create database ...
- Python可变与不可变类型及垃圾回收机制
1. 可变与不可变类型 1.1 可变类型 在id不变的情况下,value可以改变,则称之为可变类型.列表.字典与集合是可变的. l1 = [,,,,] print(id(l1)) l1[] = #改 ...