题目内容:

题目分析:有选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. js在工作中遇到的一些问题

    前言 js这种语言没有太多封装好的模式或者统一的编程方式,所以一些细节的问题很容易导致bug,那下面就写为:一份坚固的代码是什么样的. 持续更新一下,记一些good case和bug. 事件绑定的选择 ...

  2. Windows API Finishing

    input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...

  3. DxPackNet 5.视频高质量的压缩和传输

    DxPackNet 对视频的压缩和解压也提供了很好的支持,且系统不需要装第三方解码器哦~ 主要用到了 IxVideoEncoder 视频编码器  和 IxVideoDecoder 两个接口 这里只做简 ...

  4. properties基本用法

    package control; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io. ...

  5. Qt 如何使用 QImage 设置指定的颜色为透明色?

    Qt 如何使用 QImage 设置指定的颜色为透明色? 需求背景:使用华大身份证读卡器模块读取身份证信息,通过模块读取的图片为 *.BMP 格式,无透明色,故绘制到身份证上无法美观的显示. 通过查询身 ...

  6. POJ - 2912 Rochambeau 种类并查集

    题意:有三组小朋友在玩石头剪刀布,同一组的小朋友出的手势是一样的.这些小朋友中有一个是裁判,他可以随便出手势.现在给定一些小朋友的关系,问能否判断出裁判,如果能最早什么时候能够找到裁判. 思路:枚举每 ...

  7. 转:20分钟教你使用hexo搭建github博客

    注册Github账号 这里我们就不多讲了,小伙伴们可以点击这里,进入官网进行注册. 创建仓库 图片来自Github 登录账号后,在Github页面的右上方选择New repository进行仓库的创建 ...

  8. Android开发学习必备的java知识

    Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...

  9. eclipse web and java ee development

    1.打开Eclipse ->help ->install new software 2.Work with:http://download.eclipse.org/releases/gan ...

  10. Effective Java 第三版——35. 使用实例属性替代序数

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...