题目内容:

题目分析:有选A则必须选B这样的限制条件,可以发现这是最大权闭合子图模型,考虑环的情况,可以推测需要拓扑判环。

代码:

#include<bits/stdc++.h>
using namespace std; struct edge{
int from,to,flow;
}e[]; const int maxn = ,inf = ;
int n,m,num,tmp = ;
int sc[maxn][maxn];
vector <int> at[maxn][maxn];
vector <int> g[maxn*maxn+];
vector <int> ng[maxn*maxn+]; void AddEdge(int from,int to,int w){
e[num++] = (edge){from,to,w}; g[from].push_back(num-);
e[num++] = (edge){to,from,}; g[to].push_back(num-);
} int tp[maxn*maxn+],in[maxn*maxn+];
void topu(){
for(int i=;i<=n;i++) for(int j=;j<=m;j++){
if(j < m)ng[(i-)*m+j+].push_back((i-)*m+j),in[(i-)*m+j]++;
for(int k=;k<at[i][j].size();k++){
int now = at[i][j][k];
ng[(i-)*m+j].push_back(now);
in[now] ++;
}
}
queue <int> q;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)if(!in[(i-)*m+j])q.push((i-)*m+j);
while(!q.empty()){
int k = q.front();q.pop();
tp[k] = ;
for(int i=;i<ng[k].size();i++){
in[ng[k][i]]--;
if(!in[ng[k][i]])q.push(ng[k][i]);
}
}
for(int i=;i<=n*m;i++)ng[i].clear();
for(int i=;i<=n;i++) for(int j=;j<=m;j++){
if(j < m)ng[(i-)*m+j+].push_back((i-)*m+j);
for(int k=;k<at[i][j].size();k++){
int now = at[i][j][k],now2 = (i-)*m+j;
ng[now2].push_back(now);
}
}
for(int i=;i<=n*m;i++) if(tp[i] == ) q.push(i);
while(!q.empty()){
int k = q.front();q.pop();
for(int i=;i<ng[k].size();i++){
if(tp[ng[k][i]]==)continue;
tp[ng[k][i]]=;q.push(ng[k][i]);
}
}
} void build_graph(){
topu();
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(tp[(i-)*m+j]==)continue;
if(sc[i][j] > )AddEdge(,(i-)*m+j,sc[i][j]);
else AddEdge((i-)*m+j,tmp,-sc[i][j]);
for(int k=;k<at[i][j].size();k++){
int now = at[i][j][k];
if(tp[now]==)continue;
AddEdge(now,(i-)*m+j,inf);
}
if(j < m && tp[(i-)*m+j+])AddEdge((i-)*m+j,(i-)*m+j+,inf);
}
}
} void read(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
for(int j=,x;j<=m;j++){
scanf("%d%d",&sc[i][j],&x);
for(int k=,p1,q1;k<=x;k++) {
scanf("%d%d",&p1,&q1);p1++;q1++;
at[i][j].push_back((p1-)*m+q1);
}
}
}
build_graph();
} int dis[maxn*maxn+],cur[maxn*maxn+];
int BFS(){
queue <int> q;
memset(dis,-,sizeof(dis));
q.push(); dis[] = ;
while(!q.empty()){
int k = q.front();q.pop();
for(int i=;i<g[k].size();i++){
edge nxt = e[g[k][i]];
if(nxt.flow > && (dis[nxt.to]==-)){
dis[nxt.to] = dis[k]+; q.push(nxt.to);
}
}
}
return dis[tmp];
} int dfs(int x,int a){
if(x == tmp || a == ) return a;
int flow = ,f;
for(int &i=cur[x];i<g[x].size();i++){
edge &eg = e[g[x][i]];
if(dis[eg.to] > dis[x] && ((f = dfs(eg.to,min(eg.flow,a)))>)){
eg.flow -= f;
e[g[x][i]^].flow += f;
a -= f; flow += f;
if(a == ) break;
}
}
return flow;
} void work(){
int flow;
while(BFS()!=-){
memset(cur,,sizeof(cur));
flow = dfs(,inf);
}
int ans = ;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(dis[(i-)*m+j]!=-) ans += sc[i][j];
}
}
printf("%d",ans);
} int main(){
read();
work();
return ;
}

BZOJ1565 植物大战僵尸 题解的更多相关文章

  1. BZOJ1565:[NOI2009]植物大战僵尸——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1565 https://www.luogu.org/problemnew/show/P2805 Pla ...

  2. 【BZOJ1565】【NOI2009】植物大战僵尸(网络流)

    [BZOJ1565][NOI2009]植物大战僵尸(网络流) 题面 BZOJ 洛谷 题解 做了这么多神仙题,终于有一道能够凭借自己智商能够想出来的题目了.... 好感动. 这就是一个比较裸的最小割模型 ...

  3. [bzoj1565][NOI2009]植物大战僵尸_网络流_拓扑排序

    植物大战僵尸 bzoj1565 题目大意:给你一张网格图,上面种着一些植物.你从网格的最右侧开始进攻.每个植物可以对僵尸提供能量或者消耗僵尸的能量.每个植物可以保护一个特定网格内的植物,如果一个植物被 ...

  4. bzoj1565: [NOI2009]植物大战僵尸 最大权闭合子图,tarjan

    bzoj1565: [NOI2009]植物大战僵尸 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1565 思路 很容易的想到最大权闭合子图 ...

  5. 【BZOJ-1565】植物大战僵尸 拓扑排序 + 最小割

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1972  Solved: 917[Submit][Statu ...

  6. Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序

    题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:p ...

  7. tyvj P1135 - 植物大战僵尸 最大权闭合图

    P1135 - 植物大战僵尸 From ytt    Normal (OI)总时限:10s    内存限制:128MB    代码长度限制:64KB 背景 Background 虽然这么多天了,,虽然 ...

  8. BZOJ 1565 植物大战僵尸 最大权闭合子图+网络流

    题意: 植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: (1)价值: (2)保护集合,也就是这个植物可以保护矩阵中的某些格子. 现在你是僵尸,你每次只能从(i,m) 格子 ...

  9. 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码

    00413184 |. E8 77E30100   |CALL PlantsVs.00431500                  ; 地上的物品00413189 |. 8D7424 10     ...

随机推荐

  1. C# winform中Show()和ShowDialog()的区别

    项目实际开发中需要根据不同的应用场景利用Show和ShowDialog,尤其是三级弹窗,慎用ShowDialog,否则会导致关闭第三级窗体时,自动关闭第二级,解决方案就是在第一级窗体弹出时采用Show ...

  2. SpringBoot 中常用注解

    本篇博文将介绍几种SpringBoot 中常用注解 其中,各注解的作用为: @PathVaribale 获取url中的数据 @RequestParam 获取请求参数的值 @GetMapping 组合注 ...

  3. MySQL 日志的类型

    日志文件对于一个服务器来说是非常重要的,它记录着服务器的运行信息,许多操作都会写日到日志文件,通过日志文件可以监视服务器的运行状态及查看服务器的性能,还能对服务器进行排错与故障处理,MySQl中有六种 ...

  4. git一键部署代码到远程服务器(linux)(采坑总结)

    原来一直使用FileZilla来代码部署,去年使用git,代码版本管理,真TM好用,一起回顾下历程! 一. 代码部署方式及思路: 1. 使用FTP/SFTP工具,上传代码 2. git人工部署.1. ...

  5. 1.10 tuple 元组

    元组(tuple)属于不可变序列 tuple特性: 特性一:可包含任意对象的有序集合 特性二:通过下标索引访问元素 特性三:固定长度,异质,可任意嵌套 特性四:不支持原位改变 特性五:存储机制:对象引 ...

  6. windows转mac-开发环境搭建(二):mac上java环境搭建

    1.首先下载jdk,地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.安 ...

  7. WC2016自测

    挑战NPC 原题链接 爆搜20分,贪心10分,网络流30分 //挑战NPC #include <cstdio> #include <cstring> #include < ...

  8. day2(字符串、格式化输出、运算符、流程控制)

    一.字符串 在Python中,加了引号的字符都被认为是字符串! 单引号.双引号.多引号的区别? 单引号和 双引号没有任何区别,但是某种情况下需要单双配合 如 msg = " My name ...

  9. 中小研发团队架构实践之微服务MSA

    一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...

  10. filebeat -> logstash -> elasticsearch -> kibana ELK 日志收集搭建

    Filebeat 安装参考 http://blog.csdn.net/kk185800961/article/details/54579376 elasticsearch 安装参考http://blo ...