BZOJ1565 植物大战僵尸 题解
题目内容:

题目分析:有选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 植物大战僵尸 题解的更多相关文章
- BZOJ1565:[NOI2009]植物大战僵尸——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1565 https://www.luogu.org/problemnew/show/P2805 Pla ...
- 【BZOJ1565】【NOI2009】植物大战僵尸(网络流)
[BZOJ1565][NOI2009]植物大战僵尸(网络流) 题面 BZOJ 洛谷 题解 做了这么多神仙题,终于有一道能够凭借自己智商能够想出来的题目了.... 好感动. 这就是一个比较裸的最小割模型 ...
- [bzoj1565][NOI2009]植物大战僵尸_网络流_拓扑排序
植物大战僵尸 bzoj1565 题目大意:给你一张网格图,上面种着一些植物.你从网格的最右侧开始进攻.每个植物可以对僵尸提供能量或者消耗僵尸的能量.每个植物可以保护一个特定网格内的植物,如果一个植物被 ...
- bzoj1565: [NOI2009]植物大战僵尸 最大权闭合子图,tarjan
bzoj1565: [NOI2009]植物大战僵尸 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1565 思路 很容易的想到最大权闭合子图 ...
- 【BZOJ-1565】植物大战僵尸 拓扑排序 + 最小割
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1972 Solved: 917[Submit][Statu ...
- Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序
题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:p ...
- tyvj P1135 - 植物大战僵尸 最大权闭合图
P1135 - 植物大战僵尸 From ytt Normal (OI)总时限:10s 内存限制:128MB 代码长度限制:64KB 背景 Background 虽然这么多天了,,虽然 ...
- BZOJ 1565 植物大战僵尸 最大权闭合子图+网络流
题意: 植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: (1)价值: (2)保护集合,也就是这个植物可以保护矩阵中的某些格子. 现在你是僵尸,你每次只能从(i,m) 格子 ...
- 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码
00413184 |. E8 77E30100 |CALL PlantsVs.00431500 ; 地上的物品00413189 |. 8D7424 10 ...
随机推荐
- js在工作中遇到的一些问题
前言 js这种语言没有太多封装好的模式或者统一的编程方式,所以一些细节的问题很容易导致bug,那下面就写为:一份坚固的代码是什么样的. 持续更新一下,记一些good case和bug. 事件绑定的选择 ...
- Windows API Finishing
input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...
- DxPackNet 5.视频高质量的压缩和传输
DxPackNet 对视频的压缩和解压也提供了很好的支持,且系统不需要装第三方解码器哦~ 主要用到了 IxVideoEncoder 视频编码器 和 IxVideoDecoder 两个接口 这里只做简 ...
- properties基本用法
package control; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io. ...
- Qt 如何使用 QImage 设置指定的颜色为透明色?
Qt 如何使用 QImage 设置指定的颜色为透明色? 需求背景:使用华大身份证读卡器模块读取身份证信息,通过模块读取的图片为 *.BMP 格式,无透明色,故绘制到身份证上无法美观的显示. 通过查询身 ...
- POJ - 2912 Rochambeau 种类并查集
题意:有三组小朋友在玩石头剪刀布,同一组的小朋友出的手势是一样的.这些小朋友中有一个是裁判,他可以随便出手势.现在给定一些小朋友的关系,问能否判断出裁判,如果能最早什么时候能够找到裁判. 思路:枚举每 ...
- 转:20分钟教你使用hexo搭建github博客
注册Github账号 这里我们就不多讲了,小伙伴们可以点击这里,进入官网进行注册. 创建仓库 图片来自Github 登录账号后,在Github页面的右上方选择New repository进行仓库的创建 ...
- Android开发学习必备的java知识
Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...
- eclipse web and java ee development
1.打开Eclipse ->help ->install new software 2.Work with:http://download.eclipse.org/releases/gan ...
- Effective Java 第三版——35. 使用实例属性替代序数
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...