P2805 [NOI2009]植物大战僵尸
时间:2020-05-21
本文章向大家介绍P2805 [NOI2009]植物大战僵尸,主要包括P2805 [NOI2009]植物大战僵尸使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最大权闭合子图裸题、环上的点要去掉。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
const int MAXN = 32, INF = 0x3f3f3f3f;
class Graph{
private:
struct Edge{
int to, next, c;
}edge[1 << 20];
int cnt, head[1 << 10];
void add(int from, int to, int c){
edge[++cnt].to = to;
edge[cnt].c = c;
edge[cnt].next = head[from];
head[from] = cnt;
}
int dep[1 << 10];
bool bfs(void){
std::queue<int> q; q.push(s);
std::memset(dep, 0, sizeof dep); dep[s] = 1;
while(!q.empty()){
int node = q.front(); q.pop();
for(int i = head[node]; i != -1; i = edge[i].next){
if(edge[i].c && !dep[edge[i].to])
dep[edge[i].to] = dep[node] + 1, q.push(edge[i].to);
}
}
return dep[t];
}
int cur[1 << 10];
int dfs(int node, int flow){
if(node == t || !flow)
return flow;
int stream = 0, f;
for(int i = cur[node]; i != -1; i = edge[i].next){
cur[node] = i;
if(
dep[edge[i].to] == dep[node] + 1
&& (f = dfs(edge[i].to, std::min(flow, edge[i].c)))
){
edge[i].c -= f, edge[i ^ 1].c += f;
flow -= f, stream += f;
if(!flow)
break;
}
}
return stream;
}
public:
int s, t;
Graph(){
std::memset(head, -1, sizeof head);
cnt = -1;
}
void set(int src, int trm){
s = src, t = trm;
}
void add_edge(int from, int to, int c){
add(from, to, c);
add(to, from, 0);
}
int flow(void){
int f = 0;
while(bfs()){
std::memcpy(cur, head, sizeof head);
f += dfs(s, INF);
}
return f;
}
}G;
int n, m;
int ind, id[MAXN][MAXN], score[MAXN * MAXN];
struct Edge{
int to, next;
}edge[1 << 20];
int cnt, head[1 << 10];
inline void add(int from, int to){
edge[++cnt].to = to;
edge[cnt].next = head[from];
head[from] = cnt;
}
int ans;
int dim[MAXN * MAXN];
bool isIn[MAXN * MAXN];
void topo_sort(void){
std::queue<int> q;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
for(int k = head[id[i][j]]; k; k = edge[k].next)
++dim[edge[k].to];
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
if(!dim[id[i][j]])
q.push(id[i][j]), isIn[id[i][j]] = true;
while(!q.empty()){
int node = q.front(); q.pop();
for(int i = head[node]; i; i = edge[i].next){
--dim[edge[i].to];
if(!dim[edge[i].to])
q.push(edge[i].to), isIn[edge[i].to] = true;
}
}
}
int main(){
std::scanf("%d%d", &n, &m);
G.s = ++ind, G.t = ++ind;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
id[i][j] = ++ind;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j){
int w;
std::scanf("%d%d", score + id[i][j], &w);
for(int k = 1; k <= w; ++k){
int u, v;
std::scanf("%d%d", &u, &v);
++u, ++v;
add(id[i][j], id[u][v]);
}
if(j != 1)
add(id[i][j], id[i][j - 1]);
}
topo_sort();
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
if(isIn[id[i][j]]){
if(score[id[i][j]] > 0)
G.add_edge(G.s, id[i][j], +score[id[i][j]]), ans += score[id[i][j]];
else if(score[id[i][j]] < 0)
G.add_edge(id[i][j], G.t, -score[id[i][j]]);
for(int k = head[id[i][j]]; k; k = edge[k].next)
if(isIn[edge[k].to])
G.add_edge(edge[k].to, id[i][j], INF);
}
ans -= G.flow();
std::printf("%d\n", ans);
return 0;
}
原文地址:https://www.cnblogs.com/natsuka/p/12933415.html
- Castle.MVC框架介绍
- 在 .Net 设定 proxy 的方法
- MVC结构简介
- 优酷、爱奇艺、摩拜……多家网络平台被曝注册容易注销难!面临个人隐私泄露风险
- WordPress中借助.htaccess屏蔽某个IP或某个IP段(防垃圾评论)
- ASP.NET 调味品:AJAX
- CTreeCtrl 控件使用总结
- 高盛成立交易部门,涉足比特币和加密货币交易
- WordPress主题开发:添加主题更新提醒功能
- WordPress主题开发:添加主题更新提醒功能
- ASP.NET2.0应用中定制安全凭证之实践篇
- Kaggle大神带你上榜单Top2%:点击预测大赛纪实(下)
- WordPress主题后台选项开发框架 Options Framework 介绍
- vc++ 在程序中运行另一个程序的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Windows下安装yarn的三种方法
- python topk()函数求最大和最小值实例
- 详解Ubuntu环境下部署Django+uwsgi+nginx总结
- 如何从Node.js中的命令行读取输入
- pyqt5中动画的使用详解
- PyQt使用QPropertyAnimation开发简单动画
- 如何使用JavaScript漂亮地打印JSON对象
- Android使用AsyncTask加载图片的操作流程
- nodejs中post请求方式,req.body接值为空如何解决
- Kotlin使用静态变量与静态方法详解
- Android通过代码控制ListView上下滚动的方法
- Android为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件
- Android Studio 4.1 发布啦
- Spring Boot 2.4 配置文件将加载机制大变化
- 「性能提升」扩展 Spring Cache 支持多级缓存