题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2612

方法:其实就是从两个点分别探寻单源最短路径,两个点到同一个目标位置的最短路径都求出来,相加,然后找出到哪一个相同目标位置的最短路径之和最小即可,采用的模拟dijsktral算法。

要注意的一个地方是,找到一个kfc后一定还要继续去找,而不是向其他广搜题那样就停止探寻了,不能有思维定势啊。

实现方法为,初始的时候将两个源点到目标位置的距离设置为正无穷,然后分别用单元最短路径的算法模拟广搜并更新到目标位置的距离,最后在目标位置中找到最短路径之和最小的,由于正无穷和任何数之和都是正无穷,所以如果遇到不是被两个源点都可以达目标位置时,起路径和为正无穷,在比较的时候都会被忽略掉。

除此之外,记录目标位置坐标的数组不能开在200内,这里要细心,这里最多可以用接近4万个。

感想:思维定势造成一个下面如此简单的测试数据拜掉,wa了很久。

       3 5
                    Y...@
                    ####@
                    M....

代码:

View Code

#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 - 用单源最短论经模拟的简单广搜相关推荐

  1. 【HDU - 2112】 HDU Today(dijkstra单源最短路 + map转换)

    题干: HDU Today Time Limit : 15000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Tota ...

  2. 【HDU - 3499】 Flight (单源最短路+优惠问题)

    题干: Recently, Shua Shua had a big quarrel with his GF. He is so upset that he decides to take a trip ...

  3. 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)

    Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...

  4. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  5. acwing单源最短路的建图模式总结

    .根据边权的范围以及问题求解的需要,最短路问题可以分为以下 4 种情形,分别用不同的算法求解. • 单源最短路径(固定一个顶点为原点,求源点到其他每个顶点 的最短路径) • 1. 边权非负:Dijks ...

  6. 【图论专题】单源最短路的综合应用

    单源最短路径经常与DFS.DP.二分.拓扑排序等算法的结合使用. 题目列表: 题目 算法 AcWing 1135. 新年好 最短路+DFS AcWing 340. 通信线路 二分+双端队列BFS Ac ...

  7. N - Find a way HDU - 2612

    N - Find a way HDU - 2612 首先的想法是找到他们俩到每个 KFC 的最小距离,然后让和最小即可 那么怎么求他们俩到 KFC 的最小距离呢,可以从 KFC 出发去找他俩,也可以从 ...

  8. HDU 3826 Squarefree number:题目解答源码

    2019独角兽企业重金招聘Python工程师标准>>> HDU 3826 Squarefree number:题目解答源码 In mathematics,a squarefree n ...

  9. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法

    Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...

最新文章

  1. 【PAT乙级】1084 外观数列 (20 分)
  2. C++突破private的方案
  3. 语言教案 小小计算机,小班《小小手机本领大》语言教案
  4. java多线程之:SynchronousQueue队列
  5. hystrix源码小贴士之中断
  6. JDBC学习(一、概述)
  7. MySQL基础知识系统学习
  8. C语言冒泡排序(从小到大排序)
  9. 十大硬盘数据恢复软件介绍
  10. C#中汉字按照首字拼音排序
  11. 飞机大战4-我的子弹
  12. JavaScript——模拟自动饮料机
  13. 智能体重秤方案/案列/APP/小程序
  14. 给html页面图片制造滚动效果(详细注释)
  15. 202五一杯数学建模ABC三题
  16. HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)
  17. 解决PS(Photoshop)里面白色变成黄色的问题
  18. 修改了便签内容怎样再恢复?
  19. AntV-G6:画自动连线流程图
  20. 凉哥核心圈程序员必备十大图书推荐(一)

热门文章

  1. ora00936缺失表达式怎么解决_正则表达式替换函数
  2. Dubbo 3.0 前瞻:重塑 Spring Cloud 服务治理
  3. jedis操作set_redis命令行操作set集合和java方式操作set集合
  4. cc2530定时器和捕获比较_STM32学习日志——输入捕获实验(20.06.26)
  5. wireshark合并多个文件_小技巧:快速合并多个excel文件(收藏版)
  6. bat脚本 git pull_bat文件方式对git进行操作
  7. 计算机的主要危害是什么意思,cpu使用率是什么意思 cpu使用率低但是电脑卡原因...
  8. 学科实践活动感悟50字_中学生学科实践活动50字
  9. 为什么用加权平均来降噪
  10. 如何系统性掌握深度学习模型设计和优化