先上一张大家都看过而且熟悉的北京地铁线路图:
其中本人由于时间时间问题所以就写入了:昌平线,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