公交线路优化路径的查询
课程设计报告
课程:《数据结构》
题目:___公交线路优化路径的查询___
二〇一〇年六月
实验目的和要求
1、实验目的:
【问题描述】
对于某城市的公交线路,乘坐公交的顾客希望在这样的线路上实现各种优化路径的查询。
设该城市的公交线路的输入格式为:
线路编号:起始站名(该站坐标);经过的站点1 名(该站坐标);经过的站点2 名(该站坐
标);……;经过的站点n 名(该站坐标);终点站名(该站坐标)。该线路的乘坐价钱。车速。
该线路平均经过多少时间来一辆。
例如:63:A(32,45);B(76,45);C(76,90);……;N(100,100) 。1 元。1/每分钟。
5 分钟。
假定线路的乘坐价钱与乘坐站数无关,假定不考虑公交线路在路上的交通堵塞。不考虑
乘客上下车的时间。
对这样的公交线路,需要在其上进行的优化路径查询包括:任何两个站点之间最便宜的
路径;任何两个站点之间最省时间的路径。
2、实验要求:
【设计要求】
①根据上述公交线路的输入格式,定义并建立合适的图模型。
②针对上述公交线路,能查询获得任何两个站点之间最便宜的路径,即输入站名S,T
后,可以输出从S 到T 的最便宜的路径,输出格式为:线路x :站名S,…,站名M1 ;
换乘线路x :站名M1,…,站M2;…;换乘线路x:站名MK,…,站名T。共花费x
元。
③针对上述公交线路,能查询获得任何两个站点之间最省时间的路径(不考虑在中间站
等下一辆线路的等待时间),即输入站名S,T 后,可以输出从S 到T 的考虑在中间站等下
一辆线路的等待时间的最省时间的路径,输出格式为:线路x:站名S,…,站名M1;换
乘线路x:站名M1,…,站名M2;…;换乘线路x:站名MK,…,站名T。共花费x 时
间。
④针对上述公交线路,能查询获得任何两个站点之间最省时间的路径(要考虑在中间站
等下一辆线路的等待时间),即输入站名S,T 后,可以输出从S 到T 的考虑在中间站等
下一辆线路的等待时间的最省时间的路径,输出格式为:线路x:站名S,…,站名M1;
换乘线路x:站名M1,…,站名M2;…;换乘线路x:站名MK,…,站名T。共花费
x 时间。
具体程序设计代码
#define INF 65535 //定义一个最大数定为无穷值
#include
#include
#include"SEdit.h"
#define MAX 227
typedef int costAdj[MAX+1][MAX+1];//图邻接矩阵从开始记数
int Path[MAX+1][MAX+1];//图邻接矩阵从开始记数
typedef struct unDiGraph
{
int numVerts; //结点
costAdj cost; //邻接矩阵
}unDiGraph,*UNG; //图的定义
//构造带权(费用)图返回首地址G:
unDiGraph *CreateCostG()
{
unDiGraph *G;
int i,j;
if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G分配存储空间。
{
return(NULL);
}
for(i=1;i { for(j=1;j { G->cost[i][j]=INF; //初始化使G->cost[i][j]为无穷。 } } G->numVerts=227; for(i=1;i { for(j=1;j { G->cost[i][j]=G->cost[j][i]=1; } } /*G->cost[1][6]=G->cost[6][1]=96; G->cost[1][2]=G->cost[2][1]=84; G->cost[2][3]=G->cost[3][2]=51; G->cost[3][4]=G->cost[4][3]=53; G->cost[4][5]=G->cost[5][4]=40; G->cost[5][6]=G->cost[6][5]=90; G->cost[5][8]=G->cost[8][5]=67; G->cost[5][7]=G->cost[7][5]=67; G->cost[7][9]=G->cost[9][7]=25; G->cost[3][11]=G->cost[11][3]=69; G->cost[11][12]=G->cost[12][11]=13; G->cost[12][10]=G->cost[10][12]=67; G->cost[3][10]=G->cost[10][3]=34; G->cost[13][10]=G->cost[10][13]=65; G->cost[13][5]=G->cost[5][13]=118;*/ return(G); } //构造带权(时间)图返回首地址G: unDiGraph *CreateTimeG() { unDiGraph *G; int i,j; if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G分配存储空间。 { return(NULL); } for(i=1;i { for(j=1;j { G->cost[i][j]=INF;//初始化使G->cost[i][j]为无穷。 } } G->numVerts=227; for(i=1;i { for(j=1;j { G->cost[i][j]=G->cost[j][i]=5;//初始化使G->cost[i][j]为无穷。 } } /* G->cost[1][6]=G->cost[6][1]=9; G->cost[1][2]=G->cost[2][1]=8; G->cost[2][3]=G->cost[3][2]=5; G->cost[3][4]=G->cost[4][3]=5; G->cost[5][6]=G->cost[6][5]=9; G->cost[5][7]=G->cost[7][5]=6; G->cost[5][8]=G->cost[8][5]=6; G->cost[6][7]=G->cost[7][6]=6; G->cost[7][9]=G->cost[9][7]=2; G->cost[3][11]=G->cost[11][3]=6; G->cost[11][12]=G->cost[12][11]=1; G->cost[12][10]=G->cost[10][12]=6; G->cost[3][10]=G->cost[10][3]=3; G->cost[13][10]=G->cost[10][13]=6; G->cost[13][5]=G->cost[5][13]=11;*/ return(G); } //通过城市的序号i输出对应城市名称 void pr(int i) { switch(i)//运用switch语句。 { case(1) : printf(" "); break; case(2) : printf("安湖路口 "); break; case(3) : printf(" "); break; case(4) : printf("北大客运中心 "); break; case(5) : printf("北大路口 "); break; case(6) : printf("北大路中 "); break; case(7) : printf("北湖安居小区 "); break; case(8) : printf("北湖路北 "); break; case(9) : printf("北湖市场 "); break; case(10) : printf("北湖衡阳路口 "); break; case(11) : printf("北湖东二里 "); break; break; case(13) : printf("北际路口 "); break; case(14) : printf("北大江北路口 "); break; case(15) : printf("北湖东市场 "); break; case(16) : printf("滨湖广场 "); break; case(17) : printf(" "); break; case(18) : printf("朝阳济南路口 "); break; case(19) : printf("朝阳花园 "); break; case(20) : printf("长岗民主路口 "); break; case(21) : printf("长岗市场 "); break; case(22) : printf("长岗三里路口 "); break; case(23) : printf("茶花园望园路口 "); break; case(24) : printf("茶花碧湖路口 "); break; case(25) : printf("长湖金湖路口 "); break; case(26) : printf("长湖滨湖路口 "); break; case(27) : printf("长岗路中 "); break; case(28) : printf(" "); break; case(29) : printf("大学清川路口 "); break; case(30) : printf("大岭路口 "); break; case(31) : printf("动物园 "); break; break; case(33) : printf("大学路口 "); break; case(34) : printf("东博机电城 "); break; case(35) : printf("大树脚 "); break; case(36) : printf("大会堂 "); break; case(37) : printf("东葛路口 "); break; case(38) : printf("东葛中路 "); break; case(39) : printf("东葛葛村路口 "); break; case(40) : printf("东葛东路 "); break; case(41) : printf("东葛长湖路口 "); break; case(42) : printf(" "); break; case(43) : printf("二塘立交 "); break; case(44) : printf("二公里 "); break; case(45) : printf(" "); break; case(46) : printf("广西民族大学 "); break; case(47) : printf("广西大学西门 "); break; case(48) : printf("广西大学 "); break; case(49) : printf("广西大学附中 "); break; case(50) : printf("工业学校 "); break; case(51) : printf("广西大学东门 "); break; break; case(53) : printf("广西民族医院 "); break; case(54) : printf("广西艺术学院 "); break; case(55) : printf("古城路口 "); break; case(56) : printf("古城建政路口 "); break; case(57) : printf("葛村路口 "); break; case(58) : printf(" "); break; case(59) : printf("火炬路 "); break; case(60) : printf("衡阳北大路口 "); break; case(61) : printf("火炬路一支 "); break; case(62) : printf("衡阳地洞路口 "); break; case(63) : printf("衡阳路口 "); break; case(64) : printf("衡阳友爱路口 "); break; case(65) : printf("衡阳路中 "); break; case(66) : printf("火车站 "); break; case(67) : printf("衡阳园湖路口 "); break; case(68) : printf("虎邱 "); break; case(69) : printf("会展中心 "); break; case(70) : printf(" "); break; case(71) : printf("经济管理干部学院 "); break; break; case(73) : printf("江北永宁路口 "); break; case(74) : printf("建政东路 "); break; case(75) : printf("金茶花公园 "); break; case(76) : printf("金湖路口 "); break; case(77) : printf("金浦路口 "); break; case(78) : printf(" "); break; case(79) : printf("科园路口 "); break; case(80) : printf("科园综合市场 "); break; case(81) : printf("科园秀厢路口 "); break; case(82) : printf(" "); break; case(83) : printf("鲁班路口 "); break; case(84) : printf("鲁班路北 "); break; case(85) : printf("龙腾新阳路口 "); break; case(86) : printf("龙腾路 "); break; case(87) : printf("利客隆 "); break; case(88) : printf("鲤湾路口 "); break; case(89) : printf("埌东 "); break; case(90) : printf("烈士陵园 "); break; case(91) : printf(" "); break; case(92) : printf("明秀新阳路口 "); break; case(93) : printf("明秀路中 "); break; case(94) : printf("明秀友爱路口 "); break; case(95) : printf("明秀北湖路口 "); break; case(96) : printf("民生广场 "); break; case(97) : printf("民族江北路口 "); break; case(98) : printf("民族共和路口 "); break; case(99) : printf("民主路口 "); break; case(100) : printf("民族广场 "); break; case(101) : printf("民主园湖路口 "); break; case(102) : printf("明秀市场 "); break; case(103) : printf("明秀望州路口 "); break; case(104) : printf("麻村 "); break; case(105) : printf("民族茶花 "); break; case(106) : printf("茅桥 "); break; case(107) : printf(" "); break; case(108) : printf("农院路中 "); break; case(109) : printf("农大路口 "); break; case(110) : printf("南铁二衡 "); break; case(111) : printf("南环路 "); break; case(112) : printf("南湖公园 "); break; case(113) : printf("南梧景观路口 "); break; case(114) : printf("南梧望州路口 "); break; case(115) : printf(" "); break; case(116) : printf("清川桥北 "); break; case(117) : printf("青岛啤酒站 "); break; case(118) : printf("区妇幼 "); break; case(119) : printf("青年活动中心 "); break; case(120) : printf("区体育场 "); break; case(121) : printf("七星一巷路口 "); break; case(122) : printf("区交通科研所 "); break; case(123) : printf("青秀路口 "); break; case(124) : printf(" "); break; case(125) : printf("肉联厂 "); break; case(126) : printf("人民公园 "); break; case(127) : printf("人民路口 "); break; case(128) : printf("人民北大路口 "); break; case(129) : printf("人民永宁路口 "); break; case(130) : printf(" "); break; case(131) : printf("社会主义学院 "); break; case(132) : printf("胜利电脑 "); break; case(133) : printf("三医院 "); break; case(134) : printf("市福利院 "); break; case(135) : printf("市一医院 "); break; case(136) : printf("思贤路口 "); break; case(137) : printf("狮山公园 "); break; case(138) : printf("沙江桥 "); break; case(139) : printf("石门森林公园 "); break; case(140) : printf(" "); break; case(141) : printf("唐山路口 "); break; case(142) : printf("唐山路中 "); break; case(143) : printf(" "); break; case(144) : printf("思贤路口 "); break; case(145) : printf("狮山公园 "); break; case(146) : printf("沙江桥 "); break; case(147) : printf("石门森林公园 "); break; case(148) : printf(" "); break; case(149) : printf("唐山路口 "); break; break; case(151) : printf(" "); break; case(152) : printf("外语学校 "); break; case(153) : printf("武警医院 "); break; case(154) : printf("五里亭 "); break; case(155) : printf("万达广场 "); break; case(156) : printf("文化宫 "); break; case(157) : printf("文物苑 "); break; case(158) : printf("望州北二里中 "); break; case(159) : printf("望州北二里南 "); break; case(160) : printf("五医院 "); break; case(161) : printf("望州兴望路口 "); break; case(162) : printf("望州路中 "); break; case(163) : printf("望州南小区 "); break; case(164) : printf("望州南路南 "); break; case(165) : printf("望州南路 "); break; case(166) : printf(" "); break; case(167) : printf("西乡塘 "); break; case(168) : printf("西乡塘市场 "); break; case(169) : printf("秀厢大道西 "); break; break; case(171) : printf("新阳路尾 "); break; case(172) : printf("西效水厂 "); break; case(173) : printf("秀厢鲁班路口 "); break; case(174) : printf("秀灵路口 "); break; case(175) : printf("西一里中 "); break; case(176) : printf("西一里东 "); break; case(177) : printf("秀灵西一里路口 "); break; case(178) : printf("秀灵路北 "); break; case(179) : printf("秀厢秀灵路口 "); break; case(180) : printf("新阳立交 "); break; case(181) : printf("秀灵路南 "); break; case(182) : printf("秀厢市场 "); break; case(183) : printf("秀安路口 "); break; case(184) : printf("秀厢路口 "); break; case(185) : printf("西平市场 "); break; case(186) : printf("新和平商场 "); break; case(187) : printf("新民北路 "); break; case(188) : printf("新民东葛路口 "); break; case(189) : printf("新民路口 "); break; case(190) : printf("新民七星路口 "); break; case(191) : printf("星湖路口 "); break; break; case(193) : printf("厢竹长堽路口 "); break; case(194) : printf("秀厢大道东 "); break; case(195) : printf("小鸡村 "); break; case(196) : printf("星湖路北一里 "); break; case(197) : printf("新竹中路 "); break; case(198) : printf("新竹路口 "); break; case(199) : printf("新竹路东 "); break; case(200) : printf("新竹路东 "); break; case(201) : printf("厢竹东葛路口 "); break; case(202) : printf("厢竹大道中 "); break; case(203) : printf(" "); break; case(204) : printf("医科大二附院 "); break; case(205) : printf("永和北大路口 "); break; case(206) : printf("友爱路口 "); break; case(207) : printf("友爱北立交 "); break; case(208) : printf("友爱广场 "); break; case(209) : printf("园湖花鸟市场 "); break; case(210) : printf("园湖路口 "); break; case(211) : printf("园湖明秀路口 "); break; case(212) : printf("邕武立交 "); break; break; case(214) : printf("园湖建政路口 "); break; case(215) : printf("园湖路口 "); break; case(216) : printf("燕子岭路口 "); break; case(217) : printf("云景路口 "); break; case(218) : printf(" "); break; case(219) : printf("中华二支路口 "); break; case(220) : printf("中华一支路口 "); break; case(221) : printf("中华路口 "); break; case(222) : printf("中华安宁路口 "); break; case(223) : printf("皂角村 "); break; case(224) : printf("中医一附院 "); break; case(225) : printf("竹溪立交 "); break; case(226) : printf("竹溪长湖路口 "); break; } } //Floyed函数求任意两点的最短路径: void Floyed(unDiGraph *D) { int i,j,k,n; costAdj A; n=MAX; for(i=1;i<=n;i++) for(j=1;j<=n;j++) {A[i][j]=D->cost[i][j];//初始化矩阵A。 Path[i][j]=-1; //初始化矩阵p, 置-1. } for(k=1;k<=n;k++) //k为逐步加入的中间结点 for(i=1;i<=n;i++) //i为A中行号 for(j=1;j<=n;j++)