【Vijos 1607】【NOI 2009】植物大战僵尸
https://vijos.org/p/1607
vijos界面好漂亮O(∩_∩)O~~
对于一个植物x,和一个它保护的植物y,连一条边<x,y>表示x保护y,对于每个植物再向它左方的植物也连一条边,很明显能连出一个图,图中的边<x,y>的含义为如果要吃y,就必须先吃x。
这个图的强连通分量中的植物永远不会被吃,而且强联通分量中的植物连出去的边能到达的任何植物都不会被吃。
本来想先tarjan然后再dfs,然后DaD3zZ用拓扑序教我做人qwq
所有入度为0的点可以被吃,入读为0的点连出去的且不再强连通分量中的点也可以被吃,拓扑一下就好了。
把可以被吃的点拿出来就是一个最大权闭合图问题了,最小割解决。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 633;
const int inf = 0x7fffffff;
bool can[N];
int cur[N], qu[N], id[23][33], n, m, cnt = 0, tot = 0, score[N], point[N], point2[N], in[N];
struct node {int nxt, to, c;} E[N * N];
struct node2 {int nxt, to;} G[N * N];
void ins(int u, int v, int c) {E[++cnt] = (node) {point[u], v, c}; point[u] = cnt;}
void ins2(int u, int v) {G[++cnt] = (node2) {point2[u], v}; point2[u] = cnt; ++in[v];}
int d[N];
bool BFS(int s, int t) {
memset(d, 0, sizeof(int) * (t + 1));
int p = 0, q = 1; qu[1] = s; d[s] = 1;
while (p != q) {
int u = qu[++p];
for (int i = point[u]; i; i = E[i].nxt)
if (E[i].c && d[E[i].to] == 0) {
d[E[i].to] = d[u] + 1;
qu[++q] = E[i].to;
}
}
return d[t];
}
int S, T;
int dfs(int u, int a) {
if (u == T || !a) return a;
int f, flow = 0;
for (int &i = cur[u]; i; i = E[i].nxt)
if (d[E[i].to] == d[u] + 1 && (f = dfs(E[i].to, min(a, E[i].c)))) {
flow += f; E[i].c -= f; E[i ^ 1].c += f; a -= f;
if (!a) break;
}
return flow;
}
int dinic(int s, int t) {
int flow = 0;
while (BFS(s, t)) {
for (int i = 1; i <= t; ++i) cur[i] = point[i];
flow += dfs(s, inf);
}
return flow;
}
int main() {
scanf("%d%d", &n, &m);
int s, x, y;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
id[i][j] = ++tot;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) {
scanf("%d%d", score + id[i][j], &s);
for (int k = 0; k < s; ++k) {
scanf("%d%d", &x, &y);
ins2(id[i][j], id[x][y]);
}
}
for (int i = 0; i < n; ++i)
for (int j = 1; j < m; ++j)
ins2(id[i][j], id[i][j - 1]);
int head = 0, tail = 0;
for (int i = 0; i < n; ++i)
if (in[id[i][m - 1]] == 0)
qu[++tail]= id[i][m - 1];
while (head != tail) {
int u = qu[++head]; can[u] = true;
for (int i = point2[u]; i; i = G[i].nxt)
if (--in[G[i].to] == 0)
qu[++tail] = G[i].to;
}
cnt = 1;
for (int i = 1; i <= tot; ++i)
if (can[i])
for (int j = point2[i]; j; j = G[j].nxt)
if (can[G[j].to]) {
ins(G[j].to, i, inf);
ins(i, G[j].to, 0);
}
int ans = 0; S = tot + 1, T = S + 1;
for (int i = 1; i <= tot; ++i)
if (can[i]) {
if (score[i] > 0) {
ans += score[i];
ins(S, i, score[i]);
ins(i, S, 0);
} else if (score[i] < 0) {
ins(i, T, -score[i]);
ins(T, i, 0);
}
}
printf("%d\n", ans - dinic(S, T));
return 0;
}
【Vijos 1607】【NOI 2009】植物大战僵尸的更多相关文章
- java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码
Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...
- [Android] 转移“植物大战僵尸2”存档的办法,无需root
作者:zyl910 查过了很多文章,都说需要root后才能转移存档.但很多时候是不能root的,此时该怎么办呢? 我研究了很久,最终找到了一种办法,无需root也能转移存档. 一.备份 我用的是联想手 ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
- 原生JS实现的h5小游戏-植物大战僵尸
代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结 ...
- 植物大战僵尸:寻找阳光掉落Call调用
实验目标:通过遍历阳光产生的时间,寻找阳光产生的本地Call,使用代码注入器注入,自定义生成阳光 阳光CALL遍历技巧: 进入植物大战僵尸-> 当出现阳光后->马上搜索未知初始数值 返回游 ...
- [NOI2009][codevs1846]KCOJ0191]植物大战僵尸
题目描述 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombi ...
- 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸
410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:pvz.out 简单对比时间限制:2 s 内存限制:512 MB [问题描述] Plants vs ...
- P2805 [NOI2009]植物大战僵尸
题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...
- 【刷题】BZOJ 1565 [NOI2009]植物大战僵尸
Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻. ...
随机推荐
- 省队集训Day1 睡觉困难综合征
传送门:https://www.luogu.org/problem/show?pid=3613 [题解] 按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做. 写棵LCT,维护正反两种权值, ...
- 表单元素(form、文本、按钮、选择)
表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...
- iOS多线程
iOS开发Demo(示例程序)源代码
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2013年12月29日更新版) iOS程序源代码下载链接:01.大任务.zip22 ...
- 14、char和varchar的区别?
就长度来说: ♣ char的长度是不可变的; ♣ 而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为1 ...
- C# 关于调用微信接口的代码
调用微信接口前需要准备的内容. 1.微信公众平台的appid 2.微信公众平台的secret 3..获取tokenid 4.获取ticket 5.生成签名的随机串 6.生成签名的时间戳 7.生成签名 ...
- 直接在注册DB服务的时候,做beforeQuery事件监听
- abp 调试
概要 研究Abp(ASP.NET Boilerplate)框架有几个月了,从一遍遍的看官方文档,到现在看源码,一路走来学习了很多知识. 很多新手都很关心源码如何调试,我也是如此,在反复看Debuggi ...
- JS监控手机或APP返回事件
做微信项目的时候,发现在Ios微信浏览器左上角有个返回按钮,但是点击返回时不稳定,跳到不该跳的页面.网上搜了一个捕获返回事件的JS代码,记录下来,便于以后查看. <span style=&quo ...
- Mac 使用自带的Ruby 安装brew
Homebrew简称brew,OSX上的软件包管理工具,在Mac终端可以通过brew安装.更新.卸载软件. 首先要安装brew,在 mac 中使用finder 搜索 终端(terminal)打开命令行 ...
- POJ 3308
http://poj.org/problem?id=3308 考虑答案不是乘积而是和的做法, 因为对于每一个伞兵我们要么在这行内安装大炮消灭它 要么在这列中安装大炮消灭它,所以容易看出这是一个最小边覆 ...