【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进攻. ...
随机推荐
- 【NOIP】提高组2012 借教室
[算法]线段树||二分+前缀和 [题解]线段树记录区间加值和区间最大值. #include<cstdio> #include<algorithm> using namespac ...
- hdu 1070 Milk(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1070 Milk Time Limit: 2000/1000 MS (Java/Others) M ...
- bootstrap-table设置某列序号自增
col = [{ field: 'SerialNumber', title: '序号', formatter: function (value, row, index) { return index+ ...
- Python脚本 - 查询磁盘的读写次数信息
测试系统为:Centos 6.7 Python版本为: 3.6.4 脚本功能:查看指定磁盘的读写及时间等相关信息 #!/usr/bin/env python3 from collections imp ...
- rabbitmq之队列性能测试及优化方法(六)
前言 下面关注一下rabbitmq实际使用时的性能问题和怎么进行一些优化. 性能测试 针对每个需要生产/消费者与rabbitmq进行通讯的方法进行测试 测试环境 排除网络IO的干扰,采用生产者和消费者 ...
- Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)【转】
转自:http://www.linuxidc.com/Linux/2013-06/85221p3.htm 阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入 ...
- 【java报错】Unknown character set index for field '224' received from server.
在捣腾免费数据库时,使用的一个数据库提供商的服务器使用utf8mb4编码,而我的jar包还是八百年前的.然后...然后就报错了... (1) MYSQL 5.5 之前, UTF8 编码只支持1-3个字 ...
- [LabVIEW架构]ActorFramework(二)
前言 在上一个文章中,我们介绍了一下LabVIEW中AF的基本概念,本讲将以上一次的例子来讲解LabVIEW中的实现 正文 范例说明 假定两个人,一个作为老师,一个作为学生.学生每天早上给老师发送一封 ...
- tornado 模版
tornado 模版语法 取消转义 : 取消项目转义 :autoescape = None 取消模版转义:{% autoescape None %} 取消行转义 :{% raw bd %} 强制转 ...
- Android Studio代码字体模糊解决方法
问题描述: 我的电脑分辨率是(1920*1080),然而安装了Android Studio后代码的一些部分区域出现模糊的现象,应该是软件默认设置与高分屏有冲突. 如下图所示. 解决方法: 打开设置对话 ...