博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[TJOI2009] 战争游戏
阅读量:4650 次
发布时间:2019-06-09

本文共 1837 字,大约阅读时间需要 6 分钟。

题目背景

小R正在玩一个战争游戏。游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中。每支敌军都可以从当前所在的格子移动到四个相邻的格子之一,但是不能移动到包含障碍物的格子。如果敌军移动出了地图的边界,那么战争就失败了。

题目描述

现在你的任务是,在敌军开始移动前,通过飞机轰炸使得某些原本是空地的格子变得不可通行,这样就有可能阻止敌军移出地图边界(出于某种特殊的考虑,你不能直接轰炸敌军所在的格子)。由于地形不同的原因,把每个空地格子轰炸成不可通行所需的xx数目可能是不同的,你需要计算出要阻止敌军所需的最少的xx数。

输入输出格式

输入格式:

 

输入文件的第一行包含两个数M和N,分别表示矩阵的长和宽。接下来M行,每行包含用空格隔开的N个数字,每个数字表示一个格子的情况:若数字为-1,表示这个格子是障碍物;若数字为0,表示这个格子里有一支敌军;若数字为一个正数x,表示这个格子是空地,且把它轰炸成不可通行所需的xx数为x。

 

输出格式:

 

输出一个数字,表示所需的最少xx数。数据保证有解存在。

 

输入输出样例

输入样例#1: 
4 31 2 11 10 11 0 -11 1 1
输出样例#1: 
6

说明

对50%的数据,1 ≤ M,N ≤ 10

对100%的数据,1 ≤ M,N ≤ 30

矩阵里的每个数不超过100

 

    最小割套路题,拆点限流量,把0看成源,相邻的点之间连边,边界的点向汇连边,最小割就是答案。

#include
#define ll long longusing namespace std;const int maxn=1805;#define pb push_backconst int inf=1<<30;vector
g[maxn];struct lines{ int to,flow,cap;}l[maxn*233];int S,t=-1,T,d[maxn],cur[maxn];bool v[maxn];inline void add(int from,int to,int cap){ l[++t]=(lines){to,0,cap},g[from].pb(t); l[++t]=(lines){from,0,0},g[to].pb(t);}inline bool BFS(){ memset(v,0,sizeof(v)); queue
q; q.push(S); v[S]=1,d[S]=0; int x; lines e; while(!q.empty()){ x=q.front(),q.pop(); for(int i=g[x].size()-1;i>=0;i--){ e=l[g[x][i]]; if(e.flow
0) id[i][j]=++cnt; S=0,T=cnt*2+1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]>=0){ if(a[i][j]>0){ add(id[i][j],id[i][j]+cnt,a[i][j]); if(i==1||i==n||j==1||j==m) add(id[i][j]+cnt,T,inf); } for(int o=0,x,y;o<4;o++){ x=i+dx[o],y=j+dy[o]; if(x&&x<=n&&y&&y<=m&&id[x][y]) add(a[i][j]?id[i][j]+cnt:S,id[x][y],inf); } }}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); build(); printf("%d\n",max_flow()); return 0;}

  

转载于:https://www.cnblogs.com/JYYHH/p/9073460.html

你可能感兴趣的文章
LoadRunner常用术语
查看>>
关于jedis2.4以上版本的连接池配置,及工具类
查看>>
记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
查看>>
mechanize (1)
查看>>
FactoryBean
查看>>
Coolite动态加载CheckboxGroup,无法在后台中获取
查看>>
如何在我们项目中利用开源的图表(js chart)
查看>>
nfs服务器工作原理
查看>>
C3P0连接池工具类使用
查看>>
SVN常用命令备注
查看>>
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
Java反射中method.isBridge() 桥接方法
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>