[HDU] 2612 Find a way - 用单源最短论经模拟的简单广搜
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2612
方法:其实就是从两个点分别探寻单源最短路径,两个点到同一个目标位置的最短路径都求出来,相加,然后找出到哪一个相同目标位置的最短路径之和最小即可,采用的模拟dijsktral算法。
要注意的一个地方是,找到一个kfc后一定还要继续去找,而不是向其他广搜题那样就停止探寻了,不能有思维定势啊。
实现方法为,初始的时候将两个源点到目标位置的距离设置为正无穷,然后分别用单元最短路径的算法模拟广搜并更新到目标位置的距离,最后在目标位置中找到最短路径之和最小的,由于正无穷和任何数之和都是正无穷,所以如果遇到不是被两个源点都可以达目标位置时,起路径和为正无穷,在比较的时候都会被忽略掉。
除此之外,记录目标位置坐标的数组不能开在200内,这里要细心,这里最多可以用接近4万个。
感想:思维定势造成一个下面如此简单的测试数据拜掉,wa了很久。
3 5
Y...@
####@
M....
代码:
#include <iostream> #include <queue> #include<algorithm> using namespace std; int n,m; char map[202][202]; int dY[202][202]; int dM[202][202]; const char wall='#'; const char road='.'; const char Y='Y'; const char M='M'; const char KFC='@'; const int MAX=0x7fffffff; int YposX,YposY,MposX,MposY; bool v[202][202]; int deriction[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; struct Step {int x,y;int currentUsedTime; }; void BFSSearch(char who) { memset(v,false,sizeof(v));int x = who == Y ? YposX:MposX;int y = who == Y ? YposY:MposY;Step step;step.x = x;step.y = y;step.currentUsedTime = 0;queue<Step> q;q.push(step);while(!q.empty()){Step t_step = q.front();q.pop();if(!v[t_step.x][t_step.y]){v[t_step.x][t_step.y]= true;if(map[t_step.x][t_step.y]==KFC){if(who == Y && dY[t_step.x][t_step.y]>t_step.currentUsedTime)dY[t_step.x][t_step.y]=t_step.currentUsedTime;if(who == M && dM[t_step.x][t_step.y]>t_step.currentUsedTime)dM[t_step.x][t_step.y]=t_step.currentUsedTime;}//下面的部分不能放在与上面对应的else里面,找一个kfc还要继续找,//这样才符合dijsktral算法的特点。//不要受一般广搜的思维定势限制。//否则下面测试数据肯定要败掉/*3 5Y...@####@M....*/int n_x,n_y;Step n_step;for(int i =0;i<4;i++){n_x = t_step.x+deriction[i][0];n_y = t_step.y+deriction[i][1];if(map[n_x][n_y]!=wall && !v[n_x][n_y]){n_step.x=n_x;n_step.y=n_y;n_step.currentUsedTime = t_step.currentUsedTime+1;q.push(n_step);}}}} }int MyAdd(int x,int y) {if(x==MAX ||y ==MAX)return MAX;return x+y; } int MyCmp(int x,int y) {return x<y ? x : y; }void main() {while(scanf("%d %d",&n,&m)!=EOF){memset(map,wall,sizeof(map));memset(dY,0,sizeof(dY));memset(dM,0,sizeof(dM));int recordKFC[40000][2];int k=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>map[i][j];if(map[i][j] == Y){YposX = i;YposY=j;}if(map[i][j] == M){MposX = i;MposY=j;}if(map[i][j] == KFC){dY[i][j] = dM[i][j] = MAX;recordKFC[k][0] = i;recordKFC[k][1] = j;k++;}}BFSSearch(Y);BFSSearch(M);int re = MAX;for(int x=0;x<k;x++)re = MyCmp(re, MyAdd(dY[ recordKFC[x][0] ] [ recordKFC[x][1] ],dM[ recordKFC[x][0] ] [ recordKFC[x][1] ] ));cout<<11*re<<endl;} }
转载于:https://www.cnblogs.com/kbyd/archive/2013/04/20/3032273.html
[HDU] 2612 Find a way - 用单源最短论经模拟的简单广搜相关推荐
- 【HDU - 2112】 HDU Today(dijkstra单源最短路 + map转换)
题干: HDU Today Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Tota ...
- 【HDU - 3499】 Flight (单源最短路+优惠问题)
题干: Recently, Shua Shua had a big quarrel with his GF. He is so upset that he decides to take a trip ...
- 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)
Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- acwing单源最短路的建图模式总结
.根据边权的范围以及问题求解的需要,最短路问题可以分为以下 4 种情形,分别用不同的算法求解. • 单源最短路径(固定一个顶点为原点,求源点到其他每个顶点 的最短路径) • 1. 边权非负:Dijks ...
- 【图论专题】单源最短路的综合应用
单源最短路径经常与DFS.DP.二分.拓扑排序等算法的结合使用. 题目列表: 题目 算法 AcWing 1135. 新年好 最短路+DFS AcWing 340. 通信线路 二分+双端队列BFS Ac ...
- N - Find a way HDU - 2612
N - Find a way HDU - 2612 首先的想法是找到他们俩到每个 KFC 的最小距离,然后让和最小即可 那么怎么求他们俩到 KFC 的最小距离呢,可以从 KFC 出发去找他俩,也可以从 ...
- HDU 3826 Squarefree number:题目解答源码
2019独角兽企业重金招聘Python工程师标准>>> HDU 3826 Squarefree number:题目解答源码 In mathematics,a squarefree n ...
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...
最新文章
- 【PAT乙级】1084 外观数列 (20 分)
- C++突破private的方案
- 语言教案 小小计算机,小班《小小手机本领大》语言教案
- java多线程之:SynchronousQueue队列
- hystrix源码小贴士之中断
- JDBC学习(一、概述)
- MySQL基础知识系统学习
- C语言冒泡排序(从小到大排序)
- 十大硬盘数据恢复软件介绍
- C#中汉字按照首字拼音排序
- 飞机大战4-我的子弹
- JavaScript——模拟自动饮料机
- 智能体重秤方案/案列/APP/小程序
- 给html页面图片制造滚动效果(详细注释)
- 202五一杯数学建模ABC三题
- HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)
- 解决PS(Photoshop)里面白色变成黄色的问题
- 修改了便签内容怎样再恢复?
- AntV-G6:画自动连线流程图
- 凉哥核心圈程序员必备十大图书推荐(一)
热门文章
- ora00936缺失表达式怎么解决_正则表达式替换函数
- Dubbo 3.0 前瞻:重塑 Spring Cloud 服务治理
- jedis操作set_redis命令行操作set集合和java方式操作set集合
- cc2530定时器和捕获比较_STM32学习日志——输入捕获实验(20.06.26)
- wireshark合并多个文件_小技巧:快速合并多个excel文件(收藏版)
- bat脚本 git pull_bat文件方式对git进行操作
- 计算机的主要危害是什么意思,cpu使用率是什么意思 cpu使用率低但是电脑卡原因...
- 学科实践活动感悟50字_中学生学科实践活动50字
- 为什么用加权平均来降噪
- 如何系统性掌握深度学习模型设计和优化