「Luogu P3866」[TJOI2009]战争游戏 解题报告
题面
好难表述啊~
在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价
思路:
网络流最小割
“阻止”,“最小”,看到这样的字眼,肯定就要想到最小割啊
在互相能到达的点之间建边,容量为INF,因为——它不能炸……
然后把每个点拆成入点和出点,每个兵所在的出点和源点S直接相连,在最外面的点的出点和汇点T直接相连
最后套模板,OK了
最重要的还是建边,能够理解题目的意思,想出对应的策略
Code:
#include<bits/stdc++.h>
#define INF 0x7f7f7f7f
#define M 5010
#define N 2010
#define Mn 31
using namespace std;
int Cx[4]={1,0,0,-1};//预处理移动的方向
int Cy[4]={0,1,-1,0};
struct node{
int to,cap;
int nxt;
node(int a,int b):to(a),cap(b){ }
node(){ }
}b[M<<1];
int head[N],deep[N],a[Mn][Mn];
int n,m,S,T,Maxflow,Max,t=1;
bool p[Mn][Mn];
int read()
{
int s=0,p=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')
p=-1;
c=getchar();
}
while(isdigit(c))
{
s=(s<<1)+(s<<3)+c-'0';
c=getchar();
}
return s*p;
}
int Cag(int x,int y)
{
return (x-1)*m+y;
}
void add(int x,int y,int cap)
{
b[++t]=node(y,cap);
b[t].nxt=head[x];
head[x]=t;
b[++t]=node(x,0);
b[t].nxt=head[y];
head[y]=t;
return;
}
void Add(int x,int y)
{
int Tx,Ty;
for(int i=0;i<4;i++)
{
Tx=x+Cx[i];Ty=y+Cy[i];
if(p[Tx][Ty])//边框的用处
add(Cag(x,y)+Max,T,INF);//在矩阵外就和汇点T相连
else
add(Cag(x,y)+Max,Cag(Tx,Ty),INF);//否则出点和入点相连
}
return;
}
bool BFS()
{
int i,cur;
int to,cap;
queue<int>p;
memset(deep,0,sizeof(deep));
p.push(S);deep[S]=1;
while(!p.empty())
{
cur=p.front();p.pop();
for(i=head[cur];i;i=b[i].nxt)
{
to=b[i].to;cap=b[i].cap;
if(cap&&!deep[to])
{
deep[to]=deep[cur]+1;
p.push(to);
if(to==T)
return 1;
}
}
}
return 0;
}
int Dinic(int k,int flow)
{
if(k==T)
return flow;
int i,to,cap,res,rest=flow;
for(i=head[k];i&&rest;i=b[i].nxt)
{
to=b[i].to;cap=b[i].cap;
if(cap&&deep[to]==deep[k]+1)
{
res=Dinic(to,min(rest,cap));
if(!res)
deep[to]=0;
b[i].cap-=res;
b[i^1].cap+=res;
rest-=res;
}
}
return flow-rest;
}
int main()
{
int i,j,flow;
n=read();m=read();
Max=n*m;T=Max+Max+1;//汇点T
for(i=1;i<=n;i++)//裱个框,方便判断
p[i][0]=p[i][m+1]=1;
for(i=1;i<=m;i++)
p[0][i]=p[n+1][i]=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
a[i][j]=read();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(a[i][j]==-1)//如果是障碍就不建边
continue;
if(a[i][j]==0)//如果是大兵就与源点建边,注意,是出点!否则都要为zero了……
add(S,Cag(i,j)+Max,INF);
else//如果是空地,那么在自己的入点和出点之间建边
add(Cag(i,j),Cag(i,j)+Max,a[i][j]);//注意,这里的容量是a[i][j],就是要炸多少次
Add(i,j);//放个函数里看看能不能和四周相连
}
while(BFS())//Dinic模板
while((flow=Dinic(S,INF)))
Maxflow+=flow;
printf("%d",Maxflow);
return 0;
}
推荐题目
Luogu P2472 [SCOI2007]蜥蜴
有点类似,但很不相同!
「Luogu P3866」[TJOI2009]战争游戏 解题报告的更多相关文章
- 「Luogu P2015」二叉苹果树 解题报告
题面 一个二叉树,边数为n\((2<n\le 100)\),每条边有一个权值,求剪枝后剩下p\((1<p<n)\)条边,使p条边的权值和最大 还看不懂?-- 2 5 input:5 ...
- 「Luogu P1210」回文检测 解题报告
题面 这是一道诡异的黄题 居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血 思路: 保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法! ...
- 「Luogu P4987」回文项链 解题报告
题面 求环中的长度为k(k为奇数)且回文中心不同的回文串个数 思路: 刚学manacher算法,就送上一道模板题,此题注重对manacher算法的理解 Manacher,但是不用插入其他符号,因为k是 ...
- 「Luogu P1435」回文字串 解题报告
题面 主要大衣大意: 给定一个字符串,求至少加入多少个字符才能使字符串变成回文字符串 下面就是我一本正经的胡说八道题解 思路: 很显然,这应该是一道典型的最长公共子序列的题目 因此,主要思想就是DP ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
- 「CodeForces 546B」Soldier and Badges 解题报告
CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...
- P3866 [TJOI2009]战争游戏
P3866 [TJOI2009]战争游戏 题目背景 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军都 ...
- P3866 [TJOI2009]战争游戏 最小割
$ \color{#0066ff}{ 题目描述 }$ 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军 ...
- [TJOI2009] 战争游戏
题目背景 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军都可以从当前所在的格子移动到四个相邻的格子之 ...
随机推荐
- 阿里云DataV专业版发布,为可视化创造更多可能!
阿里云数据可视化应用工具DataV正式推出专业版,该版本为可视化领域专业团队和从业者量身打造,定位数据可视分析大屏搭建场景,让使用者可以轻松hold住复杂交互设计和实时数据交互查询需求. 什么是Dat ...
- laravel拓展validator验证
https://blog.csdn.net/zl20117/article/details/53536520 首先,扩展的收个问题是,我的扩展类应该放在哪儿才好呢? 直接在app目录下,建立一个目录: ...
- HDU-6668-Game 百度之星第一场B
在多个连续的区间段中,选出连续重复度最高的区间,这样连续选出多个重复度最高的不相交区间,然后从第一个区间的左边已经右边开始,连续贪心即可,答案取最小值 #include<iostream> ...
- oralce 分离表和索引
总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上. “同时 ...
- HDU1358 Period 题解 KMP算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目大意:给你一个长度为 \(n\) 的字符串 \(s\) ,那么它有 \(n\) 个前缀. 对 ...
- mysql-python安装
操作系统:ubuntu16.04-gnome 首先要安装mysql数据 sudo apt install mysql-server 我们使用pip进行安装第三方模块 系统python版本为2.7.12 ...
- 洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树
题目链接:https://www.luogu.org/problem/P3178 这道题目是一道树链剖分的模板题. 但是在解决这道问题的同事刷新了我的两个认识: 第一个认识是:树链剖分不光可以处理链, ...
- [转]Node.js中package.json中^和~的区别
webpack 项目的package.json 文件列出了项目所依赖的插件和库,同时也给出了对应的版本说明,但是在版本说明前面还有个符号:'^'(插入符号)和'~'(波浪符号),总结了下他们之间的区别 ...
- no_expand优化案例
bond 来看一个烂语句: select a.*,b.dn from temp_allcrmuser a, phs_smc_user b where a.USERNUMBER=b.dn and ( ...
- linux 阻塞 open 作为对 EBUSY 的替代
当设备不可存取, 返回一个错误常常是最合理的方法, 但是有些情况用户可能更愿意等待 设备. 例如, 如果一个数据通讯通道既用于规律地预期地传送报告(使用 crontab), 也用于根据 用户的需要偶尔 ...