【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进攻. ...
随机推荐
- [uva11137]立方数之和·简单dp
小水题再来一发 给定一个正整数n<=1e4,求将n写成若干个正整数立方和的方法数 典型的多阶段模型 f[i][j]表示当前用到1~i的数,累计和为j的方案数. #include<cstdi ...
- Linux系统文件权限体系详解
准备工作:先简单了解Linux文件权限 在Linux系统中,ls -l 命令可以查看文件的权限,如 [zhaohuizhen@localhost Test]$ ls -l a -rw-rw-r--. ...
- vue中的表单异步校验方法封装
在vue项目的开发中,表单的验证必不可少,在开发的过程中,用的是vue+iview的一套,我们知道iview的表单验证是基于async-validator,对于async-validator不熟悉的可 ...
- static class 和 non static class 的区别
static class non static class 1.用static修饰的是内部类,此时这个 内部类变为静态内部类:对测试有用: 2.内部静态类不需要有指向外部类的引用: 3.静态类只能访问 ...
- 网络知识===《图解TCP/IP》学习笔记——网络的构成要素
首先引入网络构成要素图 图片来自<图解TCP/IP--P37> 1.通信媒介与数据链路 计算机之间通过电缆相互连接,电缆可以分为多种,包括双绞线电缆,光纤电缆,同轴电缆,串行电缆等. 图片 ...
- visual studio 个性化设置
尼马visual studio 的注释建设的真垃圾 Ctrl+K+C Ctrl+K+U, 通过工具->选项->环境->键盘->命令包含中搜索“注释选定内容”,分配成 Ctrl+ ...
- [hadoop][会装]HBase集群安装--基于hadoop ha模式
可以参考部署HBase系统(分布式部署) 和基于无HA模式的hadoop下部署相比,主要是修改hbase-site .xml文件,修改如下参数即可: <property> <name ...
- hdu 2955(概率转化,01背包)
Hot~~招聘——巴卡斯(杭州),壹晨仟阳(杭州),英雄互娱(杭州) (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队? Robberies Time Limit: 2000/100 ...
- Pygame-依葫芦画瓢之兔獾大战
Pygame-依葫芦画瓢之兔獾大战 前几天看到国外一个12岁的孩子写的兔獾大战游戏,心生敬佩,想当年我还是12岁的时候还不知电脑为何物,连小霸王都未曾玩过.自己也未曾想去搞游戏开发,纯属自娱自乐.在此 ...
- css - 字体图标的制作
很多的时候我们在开发过程中一般都是直接使用图片,尤其在移动页面频繁请求图片对性能不是很好 ,所以图标字体的应用也越来越广泛.一般情况下直接用的是font awesome字体,但是有时候需要制作自己风格 ...