1、共花费x时间。 针对上述公交线路,能查询获得任何两个站点之间最省时间的路径(要考虑在中间站等下一辆线路的等待时间),即输入站名S,T后,可以输出从S到T的考虑在中间站等下一辆线路的等待时间的最省时间的路径,输出格式为:二、课程设计的主要内容(包含分工)主要内容:首先将多有要用到的结构体全部定义完全,在课程设计的进程安排12010年01月10日之前: 完成所有要用到的结构体的定义。22010年01月11日01月12日: 完成建立合适的图模型以及信息的初始化。32010年01月15日前: 将初始化的所有的信息与建立的图模型完全连接起来,写 调整函数将每一条路线的车的信息存放到所有的节点里去。420
2、10年1月16日2010年1月18日 : 完成按时间和价格的最优的方法选择路线。 5. 2010年1月19日2010年1月20日: 完成所有的程序。 6. 2010年1月21日 答辩具体分工:XX(组长):,定义所有将要用到的结构体 ,编写函数实现根据公交路线信息修改站点信息的功能 ,利用Floyd算法找出按时间的所有两站之间的最优路径 ,编写时间最优的路线选择(不考虑等待时间) ,编写时间最优的路线选择(考虑等待时间)XX :,初始化所有信息 ,建立图模型 ,编写价格最优的路线选择 ,界面优化2010年 01月11日数据结构课程设计报告(模板)一 正文1、目的 求公交线路上优化路径的查询 。
3、2、需求分析程序需要根据乘客的需要来查询的出符合要求的信息在程序运行的过程中根据提示进行输入;程序输出所有符合要求的最优的路线以供乘客选择;程序能查询任意两站之间按时间和按价格的最优路线查询;3、概要设计 先建图,再用Floyd函数求出任意两个结点之间的最优路径,后调用shortest函数进行求时间最优的路径,结束后在main函数里面提供选择界面,可以进行时间和价格最优路线的查询分别为Select_Time函数和Select_Money函数4、详细设计1)、定义结构体typedef struct int selectbusnum; char station1,station2; int sel
4、ectbusprice,selectbusgap;Selects; /存储按条件选择的最优选择路线的信息 typedef struct char StaName; char Location128;StationInfo; /站点的信息,每个站点中存放的信息有名字和位置 VRType adj; /因为是有向图,adj用来存放权值,存放的是两个结点之间 的时间值 InfoType *info; /存放弧的信息 ArCell, adjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;/adjvw 数组即v 和w之间的权值typedef struct int num; /车辆的路
5、线号 int price ; /每路车的票价 int gap; /每两次发车之间的时间间隔 int speed; /车速 int stopnum; /每辆车经过的车站的总数 StationInfo passMAX_VERTEX_NUM; /每一路车经过的站点的信息BusInfo; /车辆信息 char Location32; int stopbusnum; BusInfo stopbusMAX_BUS_NUM;VertexType; / 每个结点存放的信息,包括了站名,位置,经过的车辆数以及经过的该站点的所有的车辆的信息2)调整函数 Adjustvoid Adjust (MGraph &G,V
6、ertexType *S) int i; for (i=0;iMAX_VERTEX_NUM;i+) G.vexsi.StaName=Si.StaName; 将所有初始化的值与图联系起来, 把初始化的点的名字传给图中各个节点的StaName。void Adjust_2(BusInfo *bus,MGraph &G) int i,j,t8=0,0,0,0,0,0,0,0,p; for (i=0; for (j=0;jMAX_BUS_NUM;j+) for (p=0;pbusj.stopnum;p+) if (G.vexsi.StaName= =busj.passp.StaName) G.vexsi
7、.stopbusnum+; G.vexsi.stopbusti.num=busj.num; G.vexsi.stopbusti.price=busj.price; G.vexsi.stopbusti.gap=busj.gap; G.vexsi.stopbusti.speed=busj.speed;ti+; 将所有的初始化的点的信息以及bus的信息传递给图,每个结点中记录了经过该站的所有的车辆的信息,busj.passp是用来存放该车经过的站的信息。定义的整型数组t8是用来对每辆车经过的站的个数进行计数的。3)建立图模型int LocateVex(MGraph G,char u) int i;
8、for(i=0;G.vexnum; if (u=G.vexsi.StaName)return i; if(i=G.vexnum) printf(Error u!n);return 1; return 0;LocateVex函数在下面建图函数中调用的时候是用来找到v1,v2结点分别在G向量中的位置的。void CreateMGraph(BusInfo *bus,VertexType *S,MGraph & void Adjust (MGraph &G,VertexType *S); void Adjust_1(BusInfo *bus,VertexType *S); void Adjust_2(
9、BusInfo *bus,MGraph &G); /申明要调用的函数 Adjust (G,S); Adjust_2(bus,G); Adjust_1(bus,S); int i,j,t; G.vexnum=8;G.arcnum=11; char v1,v2,a112=A,B,DFC, EGH; int b11=8,5,6,3,2,10,7,4,5,15,20; /根据初始化的数据构建弧的权值(时i+) 间) for (j=0;j+) G.arcsij.adj=INFINITY;/ INFINITY宏定义的最大值表示距离for (t=0;t11;t+) v1=at0;v2=at1; /将v1,v
10、2赋值为弧的两端的结点 i=LocateVex(G,v1); /i表示v1在G向量结点数组中的位置 j=LocateVex(G,v2); /j表示v2在G向量结点数组中的位置 G.arcsij.adj=bt; /将数组b中的时间值赋给i到j的弧上 return;建立图模型将所有的初始化的数据放到图的每项中。4)test函数void Test(BusInfo *bus,MGraph G) int i,j; printf(路线%d 票价%d 间隔%d分钟 车速%dkm/h , busi.num,busi.price,busi.gap,busi.speed); printf(经过的站为:busi.s
11、topnum;%c%s,busi.passj.StaName,busi.passj.Location);printf( 站名%c 坐标%sn,Si.StaName,Si.Location);Si.stopbusnum; printf(停靠汽车及相关信息:路线%d 票价%d 间隔%d分钟 车速%d千米每分 G.vexsi.stopbusj.num,G.vexsi.stopbusj.price, G.vexsi.stopbusj.gap,G.vexsi.stopbusj.speed);Test函数是用来测试建立图之后,原来初始化的数据是否已经成功的存放进图。5)Show_FLOYD函数 void
12、Show_FLOYD() Test(bus,G); /先将图线输出便于后面的查看 CreateMGraph(bus,S,G); /建图 PrintMGraph(G);Test(bus,G); /图是用邻接矩阵的方法来建的,所以用在 int i,j,k,l,m,n; /这里的PrintMGraph函数是用来输出矩阵的 G.arcsii.adj=0; / ShortestPath_FLOYD()要求对角元素值为0 printf(邻接矩阵:i+) /直接有路径的输出时间,没有的在输出INFINITY for(j=0;%6d,G.arcsij); ShortestPath_FLOYD(G,&p,&d)
13、; /调用函数来找出按时间所有的的最短路径d矩阵:j+) /用二维数组来输出对应的矩阵中的权值,dij); if (dij!=100) %c到%c的最短时间为%d分 n,G.vexsi.StaName,G.vexsj.StaName,dij);p矩阵: / p矩阵用来存放路线信息从i到j的具体路线 l=G.vexnum; for(j=0; if(i!=j) m=0; / 占位空格 for(k=0;kk+) if(pijk=1)%c,G.vexsk.StaName); else m+; for(n=0;nm;n+) / 输出占位空格 /如果两个结点之间找不到可以直接通的路 / 线则在相应的位置上
14、输出空格按回车键继续.a=getchar(); system(cls /输出信息过多,清屏一次用于输出所有的两个结点的时间信息以及从每个点到其他任意一个点的具体路线6)ShortestPath_FLOYD函数 void ShortestPath_FLOYD(MGraph G,PathMatrix *P,DistancMatrix *D) / 用Floyd算法求有向网G中各对顶点v和w之间的最短路径Pvw及其 / 带权长度Dvw。若Pvwu为TRUE,则u是从v到w当前求得最短 int u,v,w,i; for(v=0;vv+) / 各对结点之间初始已知路径及距离 for(w=0;ww+) (*
15、D)vw=G.arcsvw.adj; /D矩阵用来存放每一条弧的权值即时间值 for(u=0;uu+) (*P)vwu=FALSE; if(*D)vwINFINITY)/当权值小于最大值时说明从v到w有直接路径 (*P)vwv=TRUE; /v,w之间有直接路径就将 (*P)vwv赋值为1 (*P)vww=TRUE;v+) if(*D)vu+(*D)uw(*D)vw) / 从v经u到w的一条路径更短 (*D)vw=(*D)vu+(*D)uw; (*P)vwi=(*P)vui|(*P)uwi;此函数是用来求出每个点到另外的任意一个点的按时间的最优的路径,对于有两个结点相邻但路径的时间是否是最短进
16、行判断并挑选出时间的最优的路径,下面的选择函数则是在将这些路径比较和挑选。7)Select_Time函数void Select_Time() char v1,v2; int i,j,k,m,n=0,t=0,flag=0,loc1,loc2,numMAX_BUS_NUM=1,1,1,1,1,1;/*num数组用来做标记用,已做过标记为0,没做够标记为1*/ char aMAX_VERTEX_NUM;/ * a字符数组用来存放从v1到v2的最短路径所经过的都有的站点名字 * /请输入起始站点和目的点n scanf(%c%c,&v1,&v2); for(i=0; if (v1=G.vexsi.Sta
17、Name) /找到与名字v1对应的结点 loc1=i; /用来存放出发点v1在图中的位置 printf(,G.vexsi.StaName,G.vexsi.Location); for (j=0;G.vexsi.stopbusnum; /找出所有v2点停靠的车辆的信息 printf( G.vexsi.stopbusj.num,G.vexsi.stopbusj.price, G.vexsi.stopbusj.gap,G.vexsi.stopbusj.speed);n经过的站为: for (m=0;mm+),G.vexsi.stopbusj.passm.StaName,G.vexsi.stopbus
18、j.passm.Location); /将所有v2点停靠的车辆的信息输出 if (v2=G.vexsi.StaName) loc2=i; /用来存放出发点v2在图中的位置 for (m=0; printf(n*结果*nn if (v1=busi.passj.StaName|v2=busi.passj.StaName) /判断在该车都经过的站点中有没有是v1或v2的 t+;/用来标记一条最短路径中的v1,v2出现情况 if (t=2)/t=2时则表示v1,v2两个结点都在该条最短路径中 printf(直达路线%d 票价%d 间隔%d分钟 车速%dkm/h 停靠%d站 busi.num,busi.
19、price,busi.gap,busi.speed,busi.stopnum); for (m=0;,busi.passm.StaName,busi.passm.Location); t=0;flag=1;/此处的t=0是t=2的情况重置便于下个循环的实现 t=0;/此处是将t=1是的情况重置用于下一个大循环的实现 /找出v1在图中的位置 /找出v2在图中的位置 if (dij!=INFINITY) /当i,j之间有最短路径时输出下面信息 printf(%c到%c的最短时间为%d分n if(flag!=1) /标记flag当为1时i和j直接有弧,有直接从i到j的车两站直接没有车直达,可以选择换乘!经过的站点 for(t=0; if(pijt=1) ,G.vexst.StaName); t=0; for(m=0;=G.vexnum; if(pijm=1) /当pijm为1 时说明i,j之间有直接的路径 at=G.vexsm.StaName;t+;/将每个结点的名字存放到a里 for (m=0;t-1; loc1=LocateVex(G,am); loc2=LocateVex(G,am+1);/先定义连续的两辆车 for (i=0;G.vexsloc1.stopbusnum; for (j=0;G.vexsloc2.stopbusn
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1