【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进攻. ...
随机推荐
- 【LibreOJ】#541. 「LibreOJ NOIP Round #1」七曜圣贤
[题意]一开始车上有编号为0~a的红茶,过程中出现的红茶编号仅有[0,b),有三种操作: 1.买进编号未在车上出现过的红茶. 2.丢掉车上指定编号的红茶. 3.将最早丢出去的红茶捡回来. 每次操作后求 ...
- 【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛
[题意]n头牛,其中最高h.给定r组关系a和b,要求满足h[b]>=h[a]且a.b之间都小于min(h[a],h[b]),求第i头牛可能的最高高度. [算法]差分 [题解]容易发现r组关系只能 ...
- idea编写的java代码,在cmd运行乱码解决方案
1.解决方案 使用txt打开,另存为的时候选择编码为ANSI 即可.
- js_同步和异步
刚开始写js那会,对这一块是知之甚少,太多太多的知识不足,致使做什么都很艰难.现在工作也有段时间了,知识也有了点积累, 写点什么分享一下. 同步和异步?这个问题是在使用ajax请求后台数据的时候出现的 ...
- python碎片记录(二)
1.字典中嵌套字典使用 dict={'a':{1:2,2:3}} print(dict) print(dict['a'][2]) 输出如下: {'a': {1: 2, 2: 3}} 3 2.元组与l ...
- ADO POST时出现“无法为更新定位行,一些值可能已在最后一次读取后已更改”问题的解决方法
原因有这样几种: 1.在数据库设计时,为某些字段设置了默认值,在修改进行提交以后,数据库会自动修改对应字段的所有行的默认值,从而导致了数据库与数据集中数据的不一致,使ADOQuery无法对数据集进行定 ...
- 【数位dp入门】【HDU2089】62
为了我的点歪的技能树…… 所以开始补一些sb的东西…… #include<bits/stdc++.h> typedef long long ll; using namespace std; ...
- Linux系统编程——进程间通信(一)
基本操作命令: ps -ajx/-aux/-ef 查看进程间状态/的相互关系 top 动态显示系统中的进程 nice 按照指定的优先级运行 /renice 改变正在运行的进程的优先级 kill -9杀 ...
- python插入oracle数据
# coding=utf- ''''' Created on -- @author: ''' import json; import urllib2 import sys import cx_Orac ...
- 21:序列化django对象
django的序列化框架提供了一个把django对象转换成其他格式的机制,通常这些其他的格式都是基于文本的并且用于通过一个管道发送django对象,但一个序列器是可能处理任何一个格式的(基于文本或者不 ...