题目背景

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

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

  1. 4 3
  2. 1 2 1
  3. 1 10 1
  4. 1 0 -1
  5. 1 1 1
输出样例#1:

  1. 6

说明

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

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

矩阵里的每个数不超过100

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

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int maxn=1805;
  5. #define pb push_back
  6. const int inf=1<<30;
  7. vector<int> g[maxn];
  8. struct lines{
  9. int to,flow,cap;
  10. }l[maxn*233];
  11. int S,t=-1,T,d[maxn],cur[maxn];
  12. bool v[maxn];
  13.  
  14. inline void add(int from,int to,int cap){
  15. l[++t]=(lines){to,0,cap},g[from].pb(t);
  16. l[++t]=(lines){from,0,0},g[to].pb(t);
  17. }
  18.  
  19. inline bool BFS(){
  20. memset(v,0,sizeof(v));
  21. queue<int> q; q.push(S);
  22. v[S]=1,d[S]=0;
  23. int x; lines e;
  24.  
  25. while(!q.empty()){
  26. x=q.front(),q.pop();
  27. for(int i=g[x].size()-1;i>=0;i--){
  28. e=l[g[x][i]];
  29. if(e.flow<e.cap&&!v[e.to]) v[e.to]=1,d[e.to]=d[x]+1,q.push(e.to);
  30. }
  31. }
  32.  
  33. return v[T];
  34. }
  35.  
  36. int dfs(int x,int A){
  37. if(x==T||!A) return A;
  38. int flow=0,f,sz=g[x].size();
  39. for(int &i=cur[x];i<sz;i++){
  40. lines &e=l[g[x][i]];
  41. if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(A,e.cap-e.flow)))){
  42. A-=f,flow+=f;
  43. e.flow+=f,l[g[x][i]^1].flow-=f;
  44. if(!A) break;
  45. }
  46. }
  47.  
  48. return flow;
  49. }
  50.  
  51. inline int max_flow(){
  52. int an=0;
  53. while(BFS()){
  54. memset(cur,0,sizeof(cur));
  55. an+=dfs(S,inf);
  56. }
  57. return an;
  58. }
  59.  
  60. int n,m,id[233][233],cnt=0,a[233][233];
  61. int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
  62.  
  63. inline void build(){
  64. for(int i=1;i<=n;i++)
  65. for(int j=1;j<=m;j++) if(a[i][j]>0) id[i][j]=++cnt;
  66.  
  67. S=0,T=cnt*2+1;
  68.  
  69. for(int i=1;i<=n;i++)
  70. for(int j=1;j<=m;j++) if(a[i][j]>=0){
  71. if(a[i][j]>0){
  72. add(id[i][j],id[i][j]+cnt,a[i][j]);
  73. if(i==1||i==n||j==1||j==m) add(id[i][j]+cnt,T,inf);
  74. }
  75.  
  76. for(int o=0,x,y;o<4;o++){
  77. x=i+dx[o],y=j+dy[o];
  78. if(x&&x<=n&&y&&y<=m&&id[x][y]) add(a[i][j]?id[i][j]+cnt:S,id[x][y],inf);
  79. }
  80. }
  81. }
  82.  
  83. int main(){
  84. scanf("%d%d",&n,&m);
  85. for(int i=1;i<=n;i++)
  86. for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
  87.  
  88. build();
  89. printf("%d\n",max_flow());
  90.  
  91. return 0;
  92. }

  

[TJOI2009] 战争游戏的更多相关文章

  1. P3866 [TJOI2009]战争游戏

    P3866 [TJOI2009]战争游戏 题目背景 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军都 ...

  2. P3866 [TJOI2009]战争游戏 最小割

    $ \color{#0066ff}{ 题目描述 }$ 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军 ...

  3. 「Luogu P3866」[TJOI2009]战争游戏 解题报告

    题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...

  4. 战争游戏(War Games 1983)剧情

    战争游戏 War Games(1983) 人工控制导弹发射 傍晚大雾,两值工作人员自驾一辆轿车到达监控俄罗斯核战争的防空基地,在门口出示工作证后进入基地,两工作人员和同事换班后,进入防空系统控制室开始 ...

  5. 魔兽争霸RPG游戏-军团战争-游戏经验总结

    终于要写这篇了,上一篇是个意外. 2015年关注,一代鬼王Xun和GGL比赛.晚上11点之后,经常有水友赛.主播xun,会带着一帮小弟,玩一些游戏.比如魔兽争霸6v6,2v2,RPG游戏-军团战争,疯 ...

  6. Python开发项目:大型模拟战争游戏(外星人入侵)

    外星人入侵 游戏概述: 现在准备用python开始搞一个大型游戏,模拟未来战争,地球人狙击外星人大战(其实就是小蜜蜂游戏2333),玩家控制一个飞船,用子弹歼灭屏幕上空的外星飞船:项目用到了Pygam ...

  7. Python开发【项目】:大型模拟战争游戏(外星人入侵)

    外星人入侵 游戏概述: 现在准备用python开始搞一个大型游戏,模拟未来战争,地球人狙击外星人大战(其实就是小蜜蜂游戏2333),玩家控制一个飞船,用子弹歼灭屏幕上空的外星飞船:项目用到了Pygam ...

  8. 战争游戏OverTheWire:Bandit(一)

    一个用来熟悉linux命令的游戏: Level0 告诉我们使用ssh连接网址,用户名和密码皆为bandit0.使用Xshell或者linux连接都可以 我使用的是Xshell5: Level0-> ...

  9. 3896. 【NOIP2014模拟10.26】战争游戏

    鉴于如此一道恶心的题,作者还花了一个晚上草草学了tarjan. 于是乎,这道题就是道tarjan 具体怎么实现呢?正解上有个什么树形DP,看的我一脸懵逼. 这道题可以运用到tarjan一个高科技的算法 ...

随机推荐

  1. 孤荷凌寒自学python第三十八天初识python的线程控制

     孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看 ...

  2. 孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化

    孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...

  3. neutron floating ip 限速

    查看浮动ip的id [root@10e131e69e14 oz]# openstack floating ip show 36.111.0.197 +---------------------+--- ...

  4. leetcode_day03

    https://leetcode-cn.com/problems/container-with-most-water/ 题目:盛水最多的容器 给定 n 个非负整数 a1,a2,...,an,每个数代表 ...

  5. 网络--TIME_WAIT状态

    MSL时间 MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 .MSL在RFC 1122 ...

  6. HDU 4455 Substrings ( DP好题 )

    这个……真心看不出来是个DP,我在树状数组的康庄大道上欢快的奔跑了一下午……看了题解才发现错的有多离谱. 参考:http://www.cnblogs.com/kuangbin/archive/2012 ...

  7. 二分查找树按照key值划分

    #include <iostream>#include <vector>#include <algorithm>#include <string>#in ...

  8. easyui中tab页中js脚本无法加载的问题及解决方法

    我发现tab页中<script src="xxx.js">方式加载的脚本没有生效,firebug看请求也没有请求相应的脚本文件. 单独在浏览器中打开tab页中的页面js ...

  9. Codeforces 932.B Recursive Queries

    B. Recursive Queries time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  10. 基于node的cmd迷你天气查询工具

    1.前几天网上看到的,于是自己小改了一下,更换了天气查询的接口,当作练习一下node. 2.收获挺大的,捣鼓了一天,终于学会了发布npm包. 3.接下来,就介绍一下这个 mini-tianqi 的主要 ...