题意:给你一张图,每个节点保护若干节点。

当一个节点不被保护的时候,你就可以gay掉它。

gay每个节点都有收益(可能为负),求最大总收益。

解:首先发现是一个最大权闭合子图。

把保护关系变成被保护,那么gay每个节点就必须gay每个保护它的节点。

然后发现有个小问题:有环。

于是我们tarjan求强连通分量然后删点。最后最大权闭合子图。

这里我删点删的十分暴力......(反正点不多)

注意:删点的时候,如果它权值为正,要在sum里面减去它的权值。

 #include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <stack> const int N = , M = , INF = 0x3f3f3f3f; struct Edge {
int nex, v, c;
}edge[M << ], _edge[M]; int top = , _top; int e[N], d[N], _e[N];
std::queue<int> Q;
std::stack<int> S;
int dfn[N], low[N], num, fr[N], scc_cnt, scc_siz[N], vis[N], val[N], sum; void tarjan(int x) {
dfn[x] = low[x] = ++num;
S.push(x);
for(int i = _e[x]; i; i = _edge[i].nex) {
int y = _edge[i].v;
if(!dfn[y]) {
tarjan(y);
low[x] = std::min(low[x], low[y]);
}
else if(!fr[y]) {
low[x] = std::min(low[x], dfn[y]);
}
}
if(low[x] == dfn[x]) {
scc_cnt++;
int y;
do {
y = S.top();
S.pop();
fr[y] = scc_cnt;
scc_siz[scc_cnt]++;
} while(y != x);
}
return;
} inline void add(int x, int y, int z) {
top++;
edge[top].v = y;
edge[top].c = z;
edge[top].nex = e[x];
e[x] = top; top++;
edge[top].v = x;
edge[top].c = ;
edge[top].nex = e[y];
e[y] = top;
return;
} inline void _add(int x, int y) {
_top++;
_edge[_top].v = y;
_edge[_top].nex = _e[x];
_e[x] = _top;
return;
} void del(int x) {
vis[x] = ;
if(val[x] > ) {
sum -= val[x];
}
for(int i = e[x]; i; i = edge[i].nex) {
edge[i].c = edge[i ^ ].c = ;
}
for(int i = _e[x]; i; i = _edge[i].nex) {
int y = _edge[i].v;
if(!vis[y]) {
del(y);
}
}
e[x] = _e[x] = ;
return;
} inline bool BFS(int s, int t) {
memset(d, , sizeof(d));
d[s] = ;
Q.push(s);
while(!Q.empty()) {
int x = Q.front();
Q.pop();
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(!edge[i].c || d[y]) {
continue;
}
d[y] = d[x] + ;
Q.push(y);
}
}
return d[t];
} int DFS(int x, int t, int maxF) {
if(x == t) {
return maxF;
}
int ans = ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(!edge[i].c || d[x] + != d[y]) {
continue;
}
int temp = DFS(y, t, std::min(edge[i].c, maxF - ans));
if(!temp) {
d[y] = INF;
}
ans += temp;
edge[i].c -= temp;
edge[i ^ ].c += temp;
if(ans == maxF) {
break;
}
}
return ans;
} inline int solve(int s, int t) {
int ans = ;
while(BFS(s, t)) {
ans += DFS(s, t, INF);
}
return ans;
} int m;
inline int id(int x, int y) {
return (x - ) * m + y;
} int main() { int n;
scanf("%d%d", &n, &m);
int s = n * m + , t = n * m + ;
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
int x, y, z;
scanf("%d", &x);
val[id(i, j)] = x;
if(x > ) {
add(s, id(i, j), x);
sum += x;
}
else if(x < ) {
add(id(i, j), t, -x);
}
scanf("%d", &z);
for(int k = ; k <= z; k++) {
scanf("%d%d", &x, &y);
x++;
y++;
add(id(x, y), id(i, j), INF);
_add(id(i, j), id(x, y));
}
if(j < m) {
add(id(i, j), id(i, j + ), INF);
_add(id(i, j + ), id(i, j));
}
}
}
for(int i = ; i <= n * m; i++) {
if(!dfn[i]) {
tarjan(i);
}
}
for(int i = ; i <= n * m; i++) {
if(scc_siz[fr[i]] > && !vis[i]) {
del(i);
}
}
printf("%d", sum - solve(s, t));
return ;
}

AC代码

洛谷P2805 植物大战僵尸的更多相关文章

  1. [Android] 转移“植物大战僵尸2”存档的办法,无需root

    作者:zyl910 查过了很多文章,都说需要root后才能转移存档.但很多时候是不能root的,此时该怎么办呢? 我研究了很久,最终找到了一种办法,无需root也能转移存档. 一.备份 我用的是联想手 ...

  2. 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址

    32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...

  3. 原生JS实现的h5小游戏-植物大战僵尸

    代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结 ...

  4. 植物大战僵尸:寻找阳光掉落Call调用

    实验目标:通过遍历阳光产生的时间,寻找阳光产生的本地Call,使用代码注入器注入,自定义生成阳光 阳光CALL遍历技巧: 进入植物大战僵尸-> 当出现阳光后->马上搜索未知初始数值 返回游 ...

  5. java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  6. 洛谷 P2805 BZOJ 1565 植物大战僵尸

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

  7. P2805 [NOI2009]植物大战僵尸

    题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...

  8. 洛谷 P2805 [NOI2009]植物大战僵尸 解题报告

    P2805 [NOI2009] 植物大战僵尸 题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plan ...

  9. 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

随机推荐

  1. spring MVC请求处理类注解属性详解

  2. checkbox保存和赋值

    //货物信息中的表格内容 $.each(trG.find('td input,td select'),function(i,inp){ if($(inp).attr('type')=='checkbo ...

  3. python之路--网络通信协议

    一 . osi七层协议 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 二 . tcp三次握手和四次挥手 我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真 ...

  4. Scrapy网络爬虫框架的开发使用

    1.安装 2.使用scrapy startproject  project_name 命令创建scrapy项目 如图: 3.根据提示使用scrapy genspider spider_name dom ...

  5. JavaScript之Json的使用

    Json字符串转JavaScript对象 <html> <body> <h3>通过 JSON 字符串来创建对象</h3> <p> First ...

  6. 转载 -- jquery easyui datagrid 动态表头 + 嵌套对象属性展示

    代码功能: 1.datagrid 的表头由后台生成,可以配置在数据库 2.datagrid 的列绑定数据 支撑嵌套对象 $(function() { var columns = new Array() ...

  7. Python学习之路——Day02

    今日内容: 1.编程语言介绍(***) 2.python介绍(***) 3.安装cpython解释器(多个版本)(****) 4.运行python程序的两种方式(****) 4.1 交互式 4.2 命 ...

  8. How to goproxy

    brew install python python "/users/cuthead/desktop/phuslu-goproxy-9087f35/uploader.py" sel ...

  9. Nginx 如何增大nginx使用cpu有效时长

    L:121 我们使用 这个命令查看nginx的cpu时间片切换 pidstat - 首先要知道问题: NICE 表示友好 也就是会让出时间切片 所以我们会将静态优先级设置比较低 让他很不友好 Prio ...

  10. Node.js 安装与管理

    一.node安装 Windows下,官网下载 Node.js 安装包,运行安装即可, 安装成功后,可查看版本号 node -v 二.npm npm 是 node 包管理工具,随同node一起安装,安装 ...