zoukankan      html  css  js  c++  java
  • 华为机试题(地铁换乘,图的应用)

    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();
    		}else
    		temp2+=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.结果

           本人用两种方案,所得结果如下:(仅列出部分)

  • 相关阅读:
    无线鼠标换电池了
    Jython Interactive Servlet Console YOU WILL NEVER KNOW IT EXECLLENT!!! GOOD
    Accessing Jython from Java Without Using jythonc
    jython podcast cool isnt't it?
    Python里pycurl使用记录
    Creating an Interactive JRuby Console for the Eclipse Environment
    微软为AJAX和jQuery类库提供CDN服务
    Download A File Using Cygwin and cURL
    What is JMRI?这个是做什么用的,我真没看懂但看着又很强大
    用curl 发送指定的大cookie的http/https request
  • 原文地址:https://www.cnblogs.com/chhuach2005/p/3627009.html
Copyright © 2011-2022 走看看