华为机试题(地铁换乘,图的应用)
来源:互联网 发布:阿里云黑洞解除 编辑:程序博客网 时间:2024/04/28 01:33
1.题目描述
描述: 已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18
地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15
输入: 输入两个不同的站名
输出: 输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次
样例输入: A1 A3
样例输出: 3
2.题目分析
题意如图1所示,本题关键是B5、B6,A9、A10,B10、B11,A13、A14不连续,中间有相交点,另有上下两个环。当然不用图论算法,也可以解答本题。只不过,要列出所有可能的情况,在短时间内,难免考虑的全面。作者之前就是考虑不用图做的,但做到最后,几个小时,一直有几个测试用例通过不了,考虑不全面。当然,实验室的其他同学也遇到过类似的问题。当问题的规模增加,如增加几条线路,那么这种方法,就不再好用呢。一是代码量线性增加,若列出所有情况,逻辑上也容易出错。
因此,便对此题深入研究了一下,诉之于图论算法,当然也不需要特别高深的图论算法,最简单的图的最短路径广度优先算法就够了。下面予以实现。
图1
3.图论的预备知识
3.1图的表示
因为,本文采用邻接表来表示图的,所有仅介绍图的邻接表表示,图的邻接矩阵表示请参看其他资料。图9-1,图9-2分别是有向图和其邻接表。表头为定点,表的内容为与其相邻的顶点,方向为表头到表中的内容。(注:图9-1,图9-2来自数据结构与算法分析C++第三版)
3.2无权最短路径的广度优先搜索
无权最短路径的广度优先搜索见图9-13,图9-14,图9-18,下面采用这种算法解答本题。
4.本题解答
1)头文件和数据结构:
代码中有两个map变量,vertex采用multimap来使车站和邻接的车站关联起来,v_dst使车站和起点到该车站的最短距离关联起来。
#include <queue>#include <string>#include <iostream>#include <map>using namespace std;struct gragh{multimap<string,string> vertex;map<string,int> v_dst;};typedef multimap<string,string>::iterator it;
2)建立邻接表
邻接表的建立是通过扫描字符串来实现的。具体如下:
void builttable(gragh &gar,string a){string temp1,temp2;for (int i=0;i<a.size();++i){if (a[i]==' '||i==a.size()-1){gar.v_dst.insert(make_pair(temp2,0));if (!temp1.empty()){ gar.vertex.insert(make_pair(temp2,temp1)); gar.vertex.insert(make_pair(temp1,temp2));}temp1=temp2;temp2.clear();}elsetemp2+=a[i];}}
3)图的最短路径搜索
图的最短路径搜索采用图9-18的算法,简洁明了,其中itm1,itm2分别是输入的两个车站。代码如下:
int searchgragh(gragh &gar,string itm1,string itm2){map<string,int> v_dst=gar.v_dst;queue<string> q1;q1.push(itm1);v_dst.find(itm1)->second=1;//不可重复插,这个要注意用熟练string temp;while(!q1.empty()){temp=q1.front();q1.pop();it beg=gar.vertex.lower_bound(temp);while(beg!=gar.vertex.upper_bound(temp)){if (!v_dst.find(beg->second)->second){v_dst.find(beg->second)->second=v_dst.find(temp)->second+1;q1.push(beg->second);}++beg;if (v_dst.find(itm2)->second) return v_dst.find(itm2)->second;}}return 0;}
主函数如下:
int main(){ gragh gra; string loopxian("A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18 "); string line("B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15 "); string a,b; int dist; builttable(gra,loopxian); builttable(gra,line); builttable(gra,"A1 A18 ");while(1){cin>>a>>b;dist=searchgragh(gra,a,b);cout<<a<<" "<<b<<" "<<dist<<endl;system("pause");} return 0;}
5.结果
本人用两种方案,所得结果如下:(仅列出部分)
- 华为机试题(地铁换乘,图的应用)
- 华为机试题-地铁换乘
- 地铁换乘(华为机试样题)
- 华为机试题——高级题:地铁换乘
- 华为机试—地铁换乘(图文吐血整理)
- 华为机试地铁换乘C++实现(不容易啊)
- 华为机试地铁换乘问题
- 华为机试--地铁换乘问题
- 华为地铁换乘问题
- 华为机试题, 换乘。抛砖引玉
- 华为机试 地铁换乘问题(最短路径算法)
- 华为机试题--高铁换乘(Floyed算法)
- 图的应用---最短路径问题 用迪杰斯特拉算法解决 《地铁换乘问题》
- 华为笔试题——地铁换乘
- 华为笔试题:地铁换乘问题
- 地铁换乘的线路问题
- 地铁换乘
- 地铁换乘
- Android ANR
- 振兴中华
- IOS学习笔记(十一)之IOS开发之表视图(UITableView)的基本介绍(一)
- MFC 编程
- INIT_WORK和INIT_DELAYED_WORK详解
- 华为机试题(地铁换乘,图的应用)
- Qt编程调用外部程序打开文件
- eclipse3.6 hlep下没有software update 配置
- Django1.6 用Form实现注册登录注销修改密码(含代码!)
- jq三种实现鼠标事件绑定的方法
- Android 判断不同运营商代码(附网段资料表)
- VC2008 Windows Media Player控件的使用技巧(二)
- eclipse如何修改dynamic web module version
- MVC4 EF linq从客户端中检测到有潜在的危险的Request.Path值