先上一张大家都看过而且熟悉的北京地铁线路图:

其中本人由于时间时间问题所以就写入了:昌平线,1,2,4,5,6,8,10,13共9条线路图:

接下来我说说我的思路 我的思路是这样的:

首先定义变量b,e分别代表用户搜索的开始地点和到达地点

然后加载地铁线路图主数据,下文代码中的LoadData()方法 ,此时要说明一点LoadData()方法加载的数据即是北京地铁线路图换乘的所有地铁站,放在一个有序的集合里,

【此处要ps一下,后面我会用int类型的value代表各个地铁站换乘的站名称再放在一个有序的容器里(放入方法可用选择排序),这样做的目的是为了后面代码高性能查找(以O(lgn)的二分法快速查找)】 先说到这里 后期会用此方法!

下面开始,为了便于表达本人用伪代码表示

设置北京地铁线路图换乘的所有地铁站的集合为Ux, GetLine(string stationname),函数GetPreOrNextNode(string stationname)

GetLine方法代表根据地铁站名称查找所在的地铁线,GetPreOrNextNode方法代表根据地铁站名称查找周围的换乘站(换乘结点)

0:如果b,e都为结点(换乘站) 直接进行第3步;

1:string[] nodebegin= Getline(b);string [] nodeend=gteline(e);

2:把1中的nodebegin和nodeend放入Ux集合中;

3:把nodebegin,nodeend传入方法  GetF() 进行递归操作;

这里我给出GetF()代码的一部分,要是要完整代码请使劲  点击我

 1  List<string> GetF(List<string> beginlist)
 2         {
 3             if (maindata == null) return null;
 4
 5             List<string> returnlist = new List<string>();
 6             if (beginlist.Count == 0)
 7                 isend = 1;
 8             else
 9             {
10                 foreach (string fs in beginlist)
11                 {
12                     if (fresult.Contains(fs) == false)
13                         fresult.Add(fs);
14                 }
15                  //此处省略了 比较复杂31             }
32             if (isend == 0)
33                 return GetF(returnlist);
34             else
35                 return null;
36         }

关于GetF() 方法原理可以这样理解:我们已经知道开始结点和结束结点,所以我们不用递归整个换乘结点,那么我们将除开开始结点和结束结点之外的结点给移除,这里的问题来了,

QA:我怎么知道什么结点该移除呢?

AN:因为我没能求的极权值,依次把极大的权值相关的结点除去。

这里要用到方法的核心了 贴一张图给看看:

Dijkstra无向图算法! 因为我们知道换乘是双向的,不是单向的!

ps:之前用的递归性能很低,由于代码的繁琐思维的混乱!

说了这么多我给出运行结果:

测试1:五道口----前门(非换乘站)

程序测试开始时间:2013 04 26 19 50 00 124

程序测试结束时间:2013 04 26 19 50 01 265

五道口------------->前门:
五道口-知春路-大钟寺-西直门-车公庄-阜成门-复兴门-长椿街-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-车公庄-阜成门-复兴门-西单-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-车公庄-平安里-西四-灵境胡同-西单-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-新街口-平安里-西四-灵境胡同-西单-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-新街口-平安里-车公庄-阜成门-复兴门-长椿街-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-新街口-平安里-车公庄-阜成门-复兴门-西单-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-车公庄-平安里-西四-灵境胡同-西单-复兴门-长椿街-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-新街口-平安里-西四-灵境胡同-西单-复兴门-长椿街-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-积水潭-鼓楼大街-安定门-雍和宫-东直门-东四十条-朝阳门-建国门-北京站-崇文门-前门
.

.此处省略n个 要想看全部 请点击我

.

count:774

权最大为:五道口-上地-西二旗-龙泽-回龙观-霍营-立水桥-北苑-望京西-芍药居-太阳宫-三元桥-亮马桥-农业展览馆-团结湖-呼家楼-金台夕照-国贸-双井-劲松-潘家园-十里河-分钟寺-成寿寺-宋家庄-石榴庄-大红门-角门西-马家堡-北京南站-陶然亭-菜市口-宣武门-西单-灵境胡同-西四-平安里-车公庄-阜成门-复兴门-南礼士路-木樨地-军事博物馆-公主坟-西钓鱼台-慈寿寺-车道沟-长春桥-火器营-巴沟-苏州街-海淀黄庄-人民大学-魏公村-国家图书馆-动物园-西直门-积水潭-鼓楼大街-安定门-雍和宫-东直门-东四十条-朝阳门-建国门-北京站-崇文门-前门:106.463
权最小为:五道口-知春路-大钟寺-西直门-车公庄-阜成门-复兴门-长椿街-宣武门-和平门-前门:14.204

测试2:西二旗----西单(换乘站)

程序测试开始时间:2013 04 26 20 00 03 526

程序测试结束时间:2013 04 26 20 00 04 854

西二旗------------->西单:
西二旗-西直门-平安里-西单
西二旗-西直门-车公庄-复兴门-西单
西二旗-西直门-车公庄-复兴门-宣武门-西单
西二旗-西直门-鼓楼大街-雍和宫-东四-东单-西单
西二旗-霍营-北土城-鼓楼大街-西直门-平安里-西单
西二旗-西直门-车公庄-复兴门-宣武门-崇文门-东单-西单
西二旗-西直门-国家图书馆-海淀黄庄-慈寿寺-公主坟-复兴门-西单
西二旗-霍营-立水桥-惠新西街南口-雍和宫-东四-东单-西单
西二旗-霍营-北土城-鼓楼大街-西直门-车公庄-复兴门-西单
西二旗-霍营-北土城-鼓楼大街-雍和宫-东四-东单-西单
西二旗-霍营-北土城-惠新西街南口-雍和宫-东四-东单-西单
西二旗-西直门-鼓楼大街-北土城-惠新西街南口-雍和宫-东四-东单-西单
西二旗-西直门-鼓楼大街-雍和宫-东四-东单-崇文门-宣武门-西单
西二旗-西直门-鼓楼大街-雍和宫-东直门-朝阳门-建国门-东单-西单
西二旗-西直门-车公庄-复兴门-宣武门-崇文门-建国门-东单-西单
西二旗-西直门-国家图书馆-海淀黄庄-慈寿寺-公主坟-复兴门-宣武门-西单
西二旗-霍营-立水桥-惠新西街南口-雍和宫-鼓楼大街-西直门-平安里-西单
西二旗-霍营-立水桥-惠新西街南口-北土城-鼓楼大街-西直门-平安里-西单
西二旗-霍营-北土城-鼓楼大街-西直门-车公庄-复兴门-宣武门-西单
西二旗-霍营-北土城-知春路-海淀黄庄-国家图书馆-西直门-平安里-西单
西二旗-霍营-北土城-知春路-海淀黄庄-慈寿寺-公主坟-复兴门-西单
西二旗-霍营-北土城-惠新西街南口-雍和宫-鼓楼大街-西直门-平安里-西单
西二旗-西直门-鼓楼大街-北土城-知春路-海淀黄庄-慈寿寺-公主坟-复兴门-西单
西二旗-西直门-鼓楼大街-雍和宫-东四-东单-崇文门-宣武门-复兴门-西单
西二旗-西直门-鼓楼大街-雍和宫-东四-东单-建国门-崇文门-宣武门-西单
西二旗-西直门-鼓楼大街-雍和宫-东直门-朝阳门-建国门-崇文门-东单-西单
西二旗-西直门-鼓楼大街-雍和宫-东直门-朝阳门-建国门-崇文门-宣武门-西单
西二旗-西直门-车公庄-复兴门-宣武门-角门西-宋家庄-崇文门-东单-西单
西二旗-霍营-立水桥-望京西-芍药居-东直门-雍和宫-东四-东单-西单
西二旗-霍营-立水桥-望京西-芍药居-东直门-朝阳门-建国门-东单-西单

.

.此处省略n个 要想看全部 请点击我

.

count:4602
权最大为:西二旗-西直门-车公庄-复兴门-公主坟-慈寿寺-海淀黄庄-知春路-北土城-霍营-立水桥-望京西-芍药居-三元桥-呼家楼-国贸-宋家庄-角门西-宣武门-崇文门-建国门-朝阳门-东直门-雍和宫-东四-东单-西单:117.337

权最小为:西二旗-西直门-平安里-西单:18.4

最后我我发现百度地图计算不准确了:

解释如下 先看看本人的部分换乘数据:len表示b1到b2之间的路程(this date from baidu map),timem代表时间,但是我还没用到timem次字段,预留为后期做准备!

昌平线,1,2,4,5,8,10,13, :1号线开始
b1 = "苹果园";
b2 = "公主坟";
len = "12.7";
timem = "22";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "复兴门";
b2 = "公主坟";
len = "4";
timem = "8";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "复兴门";
b2 = "西单";
len = "1.7";
timem = "3";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "东单";
b2 = "西单";
len = "3.6";
timem = "8";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "东单";
b2 = "建国门";
len = "2.3";
timem = "3";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "国贸";
b2 = "建国门";
len = "2.8";
timem = "4";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "国贸";
b2 = "四惠惠";
len = "3";
timem = "6";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "四惠东";
b2 = "四惠惠";
len = "1.7";
timem = "3";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "四惠东";
b2 = "土桥";
len = "16.6";
timem = "29";
SWAP(backlist, ref arry, b1, b2, len, timem);
昌平线,1,2,4,5,8,10,13, :1号线end

看到了“权最小为:西二旗-西直门-平安里-西单:18.4”

我再搜百度的: 是19km

我的是18.4 km ,   小于百度的搜索数据     还有一系列问题等待这去解决!

热烈欢迎大家发表自己的意见和其他!

下篇再见!

BY:SF

time: 2013-04-26-20:21

转载于:https://www.cnblogs.com/chinhi/archive/2013/04/26/bejingsbwmap.html

北京地铁线路图纯算法附带求极权值(原创) 性能提升版相关推荐

  1. 北京地铁线路图(最新-非常实用)

    北京地铁线路图: http://map.baidu.com/subways/index.html?c=beijing

  2. 蚁群算法求最值c语言实现,蚁群算法代码(求函数最值)

    <蚁群算法代码(求函数最值)>由会员分享,可在线阅读,更多相关<蚁群算法代码(求函数最值)(4页珍藏版)>请在人人文库网上搜索. 1.function F=F(x1,x2) % ...

  3. 利用Kuhn-Munkras算法求最小权值匹配

    本文参考博客: http://blog.csdn.net/zhangpinghao/article/details/12242823(代码参考该博客) http://philoscience.itey ...

  4. 小A与欧拉路 (树加边求最小权值欧拉路+树的直径)

    链接:https://ac.nowcoder.com/acm/contest/369/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...

  5. 斗地主AI算法——第四章の权值定义

    第一章业务逻辑结尾部分我提到了权值的计算方法: ①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样.③整手牌可以分成若干个组合牌,但分法不唯一. 当时,我说了① ...

  6. JQuery绘制北京地铁线路图

    [img]http://dl.iteye.com/upload/attachment/0082/1655/8f4cb561-5ffe-3fd0-b39b-7ed895777d1b.jpg[/img]图 ...

  7. 2008北京地铁线路图

  8. 左神算法:求最大子矩阵的大小(Java版)

    本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...

  9. RMQ算法,求区间最值

    poj 3264 Balanced Lineup@ 2016-07-27 11:15 49人阅读 评论(0) 收藏 举报  分类: RMQ(Range MinimumMaximum Quer)(4)  ...

最新文章

  1. 生活随笔:保险公司来的电话
  2. PHP是弱类型语言,自动转换,强制转换
  3. 武汉专科计算机学校排名2015,武汉前十名的大专:2021武汉职校排名榜
  4. 信息系统项目管理师论文范文-风险管理
  5. 多文件同时读写为什么没有单文件读写快?
  6. VTK:绘图之Diagram
  7. android 短信编解码方式,中移短信cmpp协议/smpp协议 netty实现编解码
  8. Dcmtk在PACS开发中的应用(基础篇) 第二章 打印影像(胶片) 作者 冷家锋
  9. yum方式安装android_在CentOS 7和Ubuntu14.04上安装Android Studio
  10. 【最小割】HDU 4971 A simple brute force problem.
  11. 我的JdbcUtils类
  12. Monitor线程同步
  13. Spark大数据系列教程持续更新
  14. linux文件怎么打包压缩文件,linux文件怎么打包、压缩和解压?详细教程来了!...
  15. I.Algorithm Choosing Mushrooms
  16. 2015 年度新增开源软件排名TOP100
  17. linux文件系统实现原理简述【转】
  18. 简介一些黑盒测试的方法
  19. Git远程仓库配置SSH(以github为例)
  20. 大学生用Python兼职五天狂赚1200,方法经验分享,让你早日实现财富自由

热门文章

  1. 解决Dependency ‘xxxx‘ not found
  2. php 正则过滤style,PHP 过滤常用标签的正则表达式
  3. html日期英文状态显示不出来,html 时间控件插件laydate, 显示时分,不显示秒
  4. 计算机组装与维修案例分析,计算机组装毕业论文
  5. 利用pickle保存模型
  6. 利用图基Tukey method检测数据集中的异常值
  7. 三十八、商业智能与ETL基础知识
  8. 什么叫计算机网络阻塞,计算机网络中的“线端阻塞”释义
  9. python实验三答案_20194123 实验三《Python程序设计》实验报告
  10. python所有文件都能用文本方式打开_python 打开文件方式讲解、常用读写操作指令(全)以及读写常见问题...