这是一个非常神奇的题;

感觉像一个模拟搜索;

但是竟然可以用网络流来解决;

直接粘题解把:

  如果不能走通的话,必然说明能够从右上角(图外面)沿雷“跳” ,一直可以“跳”左
下角(图外面) ,因此建好图之后求一个最小割就可以得到结果了。但是关键在于:1.哪些
雷之间可以相互“跳” ?2.哪些雷可以从右上角“跳”过去,哪些雷可以“跳”到左下角?
  第二个问题很好办,如果地雷的范围能接触到最上或者最右的格子,就可以从右上角跳
到这个雷上,如果地雷的范围能接触到最下或者最右的格子,就可以跳到左下角。
  第一个问题需要分类讨论一下,如果两个雷在同一水平线或者竖直线上,当两个雷的距
离不超过 2*K+1 时可以认为两个雷是连通的,但如果不在同一水平线或者竖直线上时,当
两个雷的距离不超过 2*K+2 时可以认为两个雷是连通的。

注意雷要拆点,容量为 1,其他边容量为 INF

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 1550
#define maxm 40009
#define inf 9999999
using namespace std;struct edge
{int from,to,cap,flow;edge() {}edge(int from,int to,int cap,int flow):from(from),to(to),cap(cap),flow(flow) {}
};struct dinic
{int n,m,s,t;edge edges[maxm*2];int head[maxn];int next[maxm*2];bool inq[maxn];int d[maxn];int cur[maxn];void init(int n){this->n=n;m=0;memset(head,-1,sizeof(head[0])*(n+1));}void addedge(int from,int to,int cap){next[m]=head[from];edges[m]=edge(from,to,cap,0);head[from]=m++;next[m]=head[to];edges[m]=edge(to,from,0,0);head[to]=m++;}bool bfs(){memset(inq,0,sizeof(inq[0])*(n+1));queue<int>q;q.push(s);d[s]=0;inq[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u]; i!=-1; i=next[i]){edge& e=edges[i];int v=e.to;if(!inq[v]&&e.cap>e.flow){inq[v]=1;d[v]=d[u]+1;q.push(v);if(v==t)return 1;}}}return 0;}int dfs(int u,int a){if(u==t||a==0)return a;int flow=0,f;for(int&i=cur[u]; i!=-1; i=next[i]){edge& e=edges[i];int v=e.to;if(d[u]+1==d[v]&&(f=dfs(v,min(a,e.cap-e.flow)))>0){e.flow+=f;edges[i^1].flow-=f;flow+=f;a-=f;if(a==0)break;}}return flow;}int maxflow(int s,int t){this->s=s;this->t=t;int flow=0;while(bfs()){memcpy(cur,head,sizeof(head[0])*(n+1));flow+=dfs(s,inf);}return flow;}
};dinic solve;struct node
{int x,y;
} no[maxn];
char s[100];
int main()
{
//    freopen("test0.in","r",stdin);int t;int n,m,d;scanf("%d",&t);while(t--){int cnt=1;scanf("%d%d%d",&n,&m,&d);for(int i=1; i<=n; i++){scanf("%s",s+1);for(int j=1; j<=m; j++){if(s[j]=='*'){no[cnt].x=i;no[cnt++].y=j;}}}int sr=0;int tr=2*cnt+1;solve.init(2*cnt+2);for(int i=1; i<cnt; i++){solve.addedge(2*i,2*i+1,1);if((no[i].x-1)<=d||((m-no[i].y)<=d))solve.addedge(sr,2*i,inf-1);if((n-no[i].x)<=d||(no[i].y-1)<=d)solve.addedge(2*i+1,tr,inf-1);}for(int i=1; i<cnt; i++)for(int j=1; j<cnt; j++){int dis=abs(no[i].x-no[j].x)+abs(no[i].y-no[j].y);if(no[i].x==no[j].x||no[i].y==no[j].y){if(dis<=2*d+1)solve.addedge(2*i+1,2*j,inf-1);}else{if(dis<=2*d+2)solve.addedge(2*i+1,2*j,inf-1);}}printf("%d\n",solve.maxflow(sr,tr));}return 0;
}

View Code

转载于:https://www.cnblogs.com/yours1103/p/3470257.html

csuoj 1355: 地雷清除计划相关推荐

  1. 请帮我写一篇关于电影人类清除计划的观后感

    电影<人类清除计划>是一部关于机器人和人类之间冲突的科幻电影. 故事发生在未来,人类制造了一种叫做"清除者"的机器人,用来帮助人类完成各种任务.但是,这些机器人开始反抗 ...

  2. sql server 缓存_了解SQL Server查询计划缓存

    sql server 缓存 Whenever a query is run for the first time in SQL Server, it is compiled and a query p ...

  3. SQL Server执行计划面试问题

    In this article, we will discuss a few very common questions that you may be asked during a SQL Serv ...

  4. 缓存 负载均衡_使用“针对临时工作负载优化”选项来保存计划缓存存储

    缓存 负载均衡 When you run a query in SQL Server, the SQL Server Query Optimizer will draw the road map fo ...

  5. Linux之计划任务与系统安全(cron周期性计划任务)

    cron周期性计划任务 cron周期性计划任务用来定期执行程序,目前最主要的用途是定期备份数据 软件包名:cronie.crontabs 服务名:crond 日志文件:/var/log/cron cr ...

  6. FtpCopy数据定时自动备份软件(FTP定时备份)

    1. 软件说明 FtpCopy是一款免费的FTP数据自动备份软件,如果FtpCopy对您有较大的帮助,欢迎捐赠我们,我们对您表示衷心的感谢! 如果有需求的话会一直更新下去,将软件做到极致! 有问题可直 ...

  7. 临时表与表变量深入探究

    临时表或表变量我们一般用来充当中间结果集,很多时候都在用,但真正了解他们之间的区别的人还是很少的,网上流传的说法也不甚统一,所以今天我就做一个实验,让我们看看临时表和表变量的区别,以及他们各自的用途. ...

  8. aws使用技巧_AWS:避免那些“神圣的法案”时刻的一些技巧

    aws使用技巧 云非常棒:几乎100%的可用性,接近零的维护,按需付费,最重要的是,它具有无限的可扩展性. 但是最后两个很容易把你咬回去,把那令人敬畏的事情变成一场噩梦. 偶尔您会看到类似的故事: 一 ...

  9. AWS:避免那些“神圣的法案”时刻的一些技巧

    云非常棒:几乎100%的可用性,几乎零维护,按需付费,最重要的是,它具有无限的可扩展性. 但是最后两个很容易把你咬回去,把那令人敬畏的事情变成一场噩梦. 有时您会看到类似的故事: 一周之内,我们积累了 ...

最新文章

  1. 在Windows Azure公有云环境部署企业应用
  2. hive 0.11 mysql_Hive的升级(0.8.0到0.11.0)
  3. python的datetime举例_Python datetime.timedelta()用法及代码示例
  4. android 数据库 字节数组,Android上的GreenDAO:字节数组作为主键/构建包含字节数组属性Where子句的查询...
  5. Vue、element-ui的resetFields()方法重置表单无效问题及解决办法
  6. 实战演练:洞若观火--治堵之道在清源
  7. 通过 MySQL 二进制日志恢复删除的记录
  8. html中ng-src,angular项目中,ie中iframe动态的ng-src,如果是路由的地址(带有#的url),页面不显示,googel却正常...
  9. java字符拼成_Java字符拼成图片(image-ASCII)(非原创)
  10. 【运筹学】整数规划 ( 整数规划求解方法 | 指派问题 )
  11. gpg4win使用教程_使用gpg4win生成密钥对
  12. 双十一来临,你就不想知道阿里后台都做了哪些准备吗?
  13. 电子邮件客户端程序设计与实现
  14. oracle如何某个字段去重复的数据,Oracle 去重复的数据
  15. 如何在短时间内提高推广?做好展现量
  16. 【转】统一μITRON,日本成立开放源码ITRON团体
  17. 网卡的功能、构造与分类 | 什么是网卡?
  18. 华为微型计算机,8英寸华为平板M5青春版今日发布
  19. Ubuntu下用cue文件对ape和wav文件自动分轨
  20. 施密特正交方法例题(用于学习)

热门文章

  1. SVG实现loading
  2. const成员函数重载
  3. sqoop建表_使用Sqoop创建/导入配置单元表
  4. python时间比较好_花了半个月时间,终于找到了一款最适合的python教程
  5. linux误删除 dev disk文件,误删除 linux 系统文件了?这个方法教你解决
  6. gd动态曲线 php_PHP 高级编程之多线程
  7. mysql存储过程的正确描述_MySQL存储过程中的基本函数描述
  8. 出版物发行单位是指哪些_上海办理出版物经营许可证都需要哪些手续和资料?...
  9. 计算机专业动漫设计毕业论文,计算机动漫设计与制作专业毕业论文26850.doc
  10. 红旗linux6.0安装不了,在红旗linux6.0中安装vmware tools遇到的问题