csuoj 1355: 地雷清除计划
这是一个非常神奇的题;
感觉像一个模拟搜索;
但是竟然可以用网络流来解决;
直接粘题解把:
如果不能走通的话,必然说明能够从右上角(图外面)沿雷“跳” ,一直可以“跳”左
下角(图外面) ,因此建好图之后求一个最小割就可以得到结果了。但是关键在于: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: 地雷清除计划相关推荐
- 请帮我写一篇关于电影人类清除计划的观后感
电影<人类清除计划>是一部关于机器人和人类之间冲突的科幻电影. 故事发生在未来,人类制造了一种叫做"清除者"的机器人,用来帮助人类完成各种任务.但是,这些机器人开始反抗 ...
- 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 ...
- SQL Server执行计划面试问题
In this article, we will discuss a few very common questions that you may be asked during a SQL Serv ...
- 缓存 负载均衡_使用“针对临时工作负载优化”选项来保存计划缓存存储
缓存 负载均衡 When you run a query in SQL Server, the SQL Server Query Optimizer will draw the road map fo ...
- Linux之计划任务与系统安全(cron周期性计划任务)
cron周期性计划任务 cron周期性计划任务用来定期执行程序,目前最主要的用途是定期备份数据 软件包名:cronie.crontabs 服务名:crond 日志文件:/var/log/cron cr ...
- FtpCopy数据定时自动备份软件(FTP定时备份)
1. 软件说明 FtpCopy是一款免费的FTP数据自动备份软件,如果FtpCopy对您有较大的帮助,欢迎捐赠我们,我们对您表示衷心的感谢! 如果有需求的话会一直更新下去,将软件做到极致! 有问题可直 ...
- 临时表与表变量深入探究
临时表或表变量我们一般用来充当中间结果集,很多时候都在用,但真正了解他们之间的区别的人还是很少的,网上流传的说法也不甚统一,所以今天我就做一个实验,让我们看看临时表和表变量的区别,以及他们各自的用途. ...
- aws使用技巧_AWS:避免那些“神圣的法案”时刻的一些技巧
aws使用技巧 云非常棒:几乎100%的可用性,接近零的维护,按需付费,最重要的是,它具有无限的可扩展性. 但是最后两个很容易把你咬回去,把那令人敬畏的事情变成一场噩梦. 偶尔您会看到类似的故事: 一 ...
- AWS:避免那些“神圣的法案”时刻的一些技巧
云非常棒:几乎100%的可用性,几乎零维护,按需付费,最重要的是,它具有无限的可扩展性. 但是最后两个很容易把你咬回去,把那令人敬畏的事情变成一场噩梦. 有时您会看到类似的故事: 一周之内,我们积累了 ...
最新文章
- 在Windows Azure公有云环境部署企业应用
- hive 0.11 mysql_Hive的升级(0.8.0到0.11.0)
- python的datetime举例_Python datetime.timedelta()用法及代码示例
- android 数据库 字节数组,Android上的GreenDAO:字节数组作为主键/构建包含字节数组属性Where子句的查询...
- Vue、element-ui的resetFields()方法重置表单无效问题及解决办法
- 实战演练:洞若观火--治堵之道在清源
- 通过 MySQL 二进制日志恢复删除的记录
- html中ng-src,angular项目中,ie中iframe动态的ng-src,如果是路由的地址(带有#的url),页面不显示,googel却正常...
- java字符拼成_Java字符拼成图片(image-ASCII)(非原创)
- 【运筹学】整数规划 ( 整数规划求解方法 | 指派问题 )
- gpg4win使用教程_使用gpg4win生成密钥对
- 双十一来临,你就不想知道阿里后台都做了哪些准备吗?
- 电子邮件客户端程序设计与实现
- oracle如何某个字段去重复的数据,Oracle 去重复的数据
- 如何在短时间内提高推广?做好展现量
- 【转】统一μITRON,日本成立开放源码ITRON团体
- 网卡的功能、构造与分类 | 什么是网卡?
- 华为微型计算机,8英寸华为平板M5青春版今日发布
- Ubuntu下用cue文件对ape和wav文件自动分轨
- 施密特正交方法例题(用于学习)
热门文章
- SVG实现loading
- const成员函数重载
- sqoop建表_使用Sqoop创建/导入配置单元表
- python时间比较好_花了半个月时间,终于找到了一款最适合的python教程
- linux误删除 dev disk文件,误删除 linux 系统文件了?这个方法教你解决
- gd动态曲线 php_PHP 高级编程之多线程
- mysql存储过程的正确描述_MySQL存储过程中的基本函数描述
- 出版物发行单位是指哪些_上海办理出版物经营许可证都需要哪些手续和资料?...
- 计算机专业动漫设计毕业论文,计算机动漫设计与制作专业毕业论文26850.doc
- 红旗linux6.0安装不了,在红旗linux6.0中安装vmware tools遇到的问题