先拓扑排序搞出合法的, 然后就是最大权闭合图模型了....

---------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
#define Id(x, y) ((x) * c + (y))
 
const int maxv = 700;
const int INF = 10000000;
 
int r, c;
int deg[maxv], w[maxv], q[maxv], Id[maxv];
 
struct edge {
int t;
edge* nxt;
} E[maxv * maxv], *pt = E, *Head[maxv];
 
inline void AddEdge(int u, int v) {
deg[pt->t = v]++, pt->nxt = Head[u], Head[u] = pt++;
}
 
namespace G {
struct edge {
int t, c;
edge *nxt, *rev;
} E[maxv * maxv], *e = E, *Head[maxv], *p[maxv], *cur[maxv];
int V, h[maxv], cnt[maxv];
inline void Add(int u, int v, int c) {
e->t = v, e->c = c, e->nxt = Head[u], Head[u] = e++;
}
inline void AddEdge(int u, int v, int c) {
Add(u, v, c), Add(v, u, 0);
Head[u]->rev = Head[v];
Head[v]->rev = Head[u];
}
void Work() {
int S = V++, T = V++, ans = 0;
for(int i = r * c; i--; ) if(~Id[i]) {
if(w[i] > 0) {
ans += w[i], AddEdge(S, Id[i], w[i]);
} else
AddEdge(Id[i], T, -w[i]);
}
for(int i = 0; i < V; i++)
cnt[i] = h[i] = 0, cur[i] = Head[i];
cnt[0] = V;
for(int x = S, A = INF; h[S] < V; ) {
for(e = cur[x]; e; e = e->nxt)
if(e->c && h[e->t] + 1 == h[x]) break;
if(e) {
p[e->t] = cur[x] = e;
A = min(A, e->c);
if((x = e->t) == T) {
for(; x != S; x = p[x]->rev->t)
p[x]->c -= A, p[x]->rev->c += A;
ans -= A, A = INF;
}
} else {
if(!--cnt[h[x]]) break;
h[x] = V;
for(e = Head[x]; e; e = e->nxt) if(h[e->t] + 1 < h[x] && e->c)
h[x] = h[e->t] + 1, cur[x] = e;
cnt[h[x]]++;
if(x != S) x = p[x]->rev->t;
}
}
printf("%d\n", ans);
}
}
 
void Init() {
int n;
scanf("%d%d", &r, &c);
memset(deg, 0, sizeof deg);
memset(Id, -1, sizeof Id);
for(int i = 0; i < r; i++)
for(int j = 0; j < c; j++) {
scanf("%d%d", w + Id(i, j), &n);
while(n--) {
int x, y; scanf("%d%d", &x, &y);
AddEdge(Id(i, j), Id(x, y));
}
if(j) AddEdge(Id(i, j), Id(i, j - 1));
}
}
 
void BFS() {
int h = 0, t = 0, x, &V = G::V = 0;
for(int i = r * c; i--; )
if(!deg[i]) q[t++] = i;
while(h < t) {
Id[x = q[h++]] = V++;
for(edge* e = Head[x]; e; e = e->nxt)
if(!--deg[e->t]) q[t++] = e->t;
}
}
 
void Work() {
for(int i = r * c; i--; ) if(~Id[i])
for(edge* e = Head[i]; e; e = e->nxt)
if(~Id[e->t]) G::AddEdge(Id[e->t], Id[i], INF);
G::Work();
}
 
int main() {
Init();
BFS();
Work();
return 0;
}

---------------------------------------------------------------------

1565: [NOI2009]植物大战僵尸

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1807  Solved: 835
[Submit][Status][Discuss]

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

HINT

在样例中, 植物P1,1可以攻击位置(0,0), P2, 0可以攻击位置(2,1)。 
一个方案为,首先进攻P1,1, P0,1,此时可以攻击P0,0 。共得到能源收益为(-5)+20+10 = 25。注意, 位置(2,1)被植物P2,0保护,所以无法攻击第2行中的任何植物。 
【大致数据规模】
约20%的数据满足1 ≤ N, M ≤ 5;
约40%的数据满足1 ≤ N, M ≤ 10;
约100%的数据满足1 ≤ N ≤ 20,1 ≤ M ≤ 30,-10000 ≤ Score ≤ 10000 。

Source

BZOJ 1565: [NOI2009]植物大战僵尸( 最小割 )的更多相关文章

  1. bzoj 1565 [NOI2009]植物大战僵尸 解题报告

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2161  Solved: 1000[Submit][Stat ...

  2. Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序

    题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:p ...

  3. BZOJ 1565 NOI2009 植物大战僵尸 topo+最小割(最大权闭合子图)

    题目链接:https://www.luogu.org/problemnew/show/P2805(bzoj那个实在是有点小小的辣眼睛...我就把洛谷的丢出来吧...) 题意概述:给出一张有向图,这张有 ...

  4. BZOJ 1565 [NOI2009]植物大战僵尸 | 网络流

    传送门 BZOJ 1565 题解 这道题也是个经典的最大权闭合子图-- 复习一下最大权闭合子图是什么? 就是一个DAG上,每个点有个或正或负的点权,有的点依赖于另外一些点(如果选这个点,则被依赖点必选 ...

  5. P2805 [NOI2009]植物大战僵尸(最小割+拓扑排序)

    题意: n*m的矩阵,每个位置都有一个植物.每个植物都有一个价值(可以为负),以及一些它可以攻击的位置.从每行的最右面开始放置僵尸,僵尸从右往左行动,当僵尸在植物攻击范围内时会立刻死亡.僵尸每到一个位 ...

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

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

  7. BZOJ 1565: [NOI2009]植物大战僵尸(网络流+缩点)

    传送门 解题思路 最大权闭合子图.但是要注意一些细节,假如有一堆植物形成一个环,那么这些植物都是无敌的,并且他们保护的植物是无敌的,他们保护的保护的植物是无敌 的.所以要缩点,然后拓扑排序一次判无敌, ...

  8. 1565: [NOI2009]植物大战僵尸 - BZOJ

    Description Input Output仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0.Sample Input3 210 020 0-10 0 ...

  9. BZOJ 1565: [NOI2009]植物大战僵尸

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2317  Solved: 1071[Submit][Stat ...

随机推荐

  1. Jquery弹窗插件Lhgdialog的用法

    Lhgdialog的用法 大家都知道用js可以实现,但是在使用js实现的弹窗时得考虑很东西:浏览器的兼容.页面的交互等等问题. 在这里简单介绍一下lhgdialog的用法. 参数有: Title:弹窗 ...

  2. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  3. 构建一个用于产品介绍的WEB应用

    为了让用户更好地了解您的产品功能,您在发布新产品或者升级产品功能的时候,不妨使用一个产品介绍的向导,引导用户熟悉产品功能和流程.本文将给您介绍一款优秀的用于产品介绍的WEB应用. 就像微博或邮箱这类W ...

  4. .NET程序员生活开始

    不知不觉,开始踏入程序员生活了!加油吧.有关Session的好文章: 最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错, ...

  5. html系列教程--DOCTYPE a area

    <!DOCTYPE>标签:<!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令.在 HTML 4.01 中,& ...

  6. 自定义UICollectionViewLayout 实现瀑布流

    今天研究了一下自定义UICollectionViewLayout. 看了看官方文档,要自定义UICollectionViewLayout,需要创建一个UICollectionViewLayout的子类 ...

  7. XML CDATA(Mybatis mapper and XML)

    Tip:must be followed by either attribute specifications, ">" or "/>". 所有 X ...

  8. JAVA G1收集器 第11节

    JAVA G1收集器 第11节 上两章我们讲了新生代和年老代的收集器,那么这一章的话我们就要讲一个收集范围涵盖整个堆的收集器——G1收集器. 先讲讲G1收集器的特点,他也是个多线程的收集器,能够充分利 ...

  9. Linux下为何都是文件的理解

    所谓“文件”,就是在我们的电脑中,以实现某种功能.或某个软件的部分功能为目的而定义的一个单位. Linux都是以文件的形式存在,当我们访问某个文件(Linux中的文件有目录,连接,普通文本),由于Li ...

  10. Struts2问题,已解决No result defined for action and result input

    struts2.1.8 必须在struts.xml中配置namespace属性 如果你在2.0中一切OK,但是在2.1中确出现了No result defined for action的异常,就是在因 ...