数据结构第二次试验.地铁换乘Word文档下载推荐.docx
- 文档编号:13074687
- 上传时间:2022-10-04
- 格式:DOCX
- 页数:13
- 大小:683.28KB
数据结构第二次试验.地铁换乘Word文档下载推荐.docx
《数据结构第二次试验.地铁换乘Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构第二次试验.地铁换乘Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
地铁3号线(环线)经过车站:
C1C2C3C4C5T1C6C7C8C9C10T5C11C12C13T6C14C15T4C16C17C18
实验要求
1)用户从键盘输入两个不同的站名,程序输出最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次);
2)分别基于迪杰斯特拉算法和弗洛里德算法实现上述地铁换乘问题;
3)程序功能模块的划分要适当,多使用流程图来描述算法结构。
1需求分析
1)输入的形式和输入值的范围。
输入的形式需要是地铁站的名称,如“A1”、“B7”、
“C14”。
所输入的的站点名不能是所要求的站点名之外的名称。
2)输出的形式。
所输出的是基于弗洛里德算法与迪杰斯特拉算法进行的最短路径长度求解的结果,以及最短路径的车站路径编号,并在输入错误的时候允许重复输入。
3)程序所能达到的功能。
用户输入车站起点与车站终点之后,通过迪杰斯特拉算法与
弗洛伊德算法,输出从起点到终点的最短路径长度,以及最短路径所经过的车站编号。
4)测试数据。
在程序运行的开始,会提示用户输入起点与终点,在用户输入起点与终点之后,程序会输出根据弗洛伊德算法所得到的最短路径所经过的车站数量,及经过的车站路径的编号。
之后会再输出根据迪杰斯特拉算法所得的最短路径所经过的车站数量,及所经过的车站路径的编号。
如果所输入起点或终点不存在,则会提示“起点/终点输入错误,请确认后重新输入。
”之后会继续出现“请输入起点/终点:
”之后,用户就可以重新输入原来输入错误的起点或终点车站名。
在确认起点与终点都输入正确之后,程序就会输出最短路径与路径编号。
在一次程序执行完毕后,支持用户重复输入。
2概要设计
在程序中之定义了一种抽象数据类型,structGraph,它包含三个元素,intarrAcc[56][56];
//邻接矩阵intverCount;
//点数intarcCount;
//边数。
并且在程序开始的时候,还定义了长度为56的string型数组,用于存储所有的地铁站点。
在程序运行开始的时候,会先调用change_train函数,在change_train函数中,会先对g.arrAcc[56][56]邻接矩阵进行初始化。
之后调用floyd函数,及printres函数,输出起点到终点的最短路径长度及路径车站编号。
之后,会继续调用Dijkstra函数及searchPath函数,输出起点到终点的最短路径长度及路径车站编号。
3详细设计
类视图
整个程序中所写的函数有:
floyd函数,transform函数,printres函数,Dijkstra函数,
searchPath函数,change_train函数。
Floyd函数(图g,邻接矩阵dis[][],用来存储路径的矩阵path[][])
{
//初始化path矩阵
For(row0to总的站点数)
For(col0to总的站点数)path[row][col]←row;
For(k0to总的站点数)For(i0to总的站点数)
For(j0to总的站点数)
//存在更近的路径,更新
If(dis[i][j]>
dis[i][k]+dis[k][j]){
dis[i][j]←dis[i][k]+dis[k][j];
path[i][j]←path[k][j];
}
Transform函数(字符c)
For(i0to站点数)
If(存储所有站点的数组s[i]==c)
返回i;
Printres函数(图Graph*p,经floyd函数转化后的邻接矩阵dis[56][56],存储路径的矩阵
path[56][56],起点start,终点end)
起点数码st=transform(起点字符start);
终点数码en=transform(终点字符end);
//将起点与终点转化为存储站点的数组中对应的下标输出<
<
”起点->
终点”<
endl;
输出<
"
根据弗洛伊德算法得,最少经过的车站数量:
"
dis[st][en]+1<
经过的车站路径编号:
;
For(i0to站点数)
For(j0to站点数)
If(i==起点数码st并且j==终点数码en)//输出路径
stack<
int>
pathrout;
//压栈
k←j;
do{
k←path[i][k];
k入pathrout的栈
}当(k不等于i);
存储站点的数组s[pathrout的栈顶元素];
弹出pathrout的栈顶元素;
length←栈pathrout的大小;
For(t0tolength)
->
弹出pathrout的栈顶元素;
用户输入的终点;
跳出循环;
Dijkstra函数(总的站点数n,起点v,当前点到起点的最短路径长度distence,记录当前节点的掐一个节点prev,记录图两点间的路径长度c[56][56])
bools[56];
//判断是否已存入该点到S集合中For(i0to总的站点数n)
distence[i]←c[v][i];
s[i]=0;
//初始都未用过该点
If(起点到第i个点的距离为1000)
第i个点的前一个点为0;
否则
第i个点的前一个点为起点;
//依次将未放入S集合的结点中,取distence[]最小值的结点,放入结合S中
//一旦S包含了所有V中顶点,distence就记录了从源点到所有其他顶点之间的最短路径长度For(i1ton)
u←v;
//找出当前未使用的点j的distence[j]最小值For(j0ton)
if(s[j]等于0并且起点到第j个点的距离(temp)小于1000)
u←j;
//u保存当前邻接点中距离最小的点的号码
tmp←distence[j];
s[u]←1;
//表示u点已存入S集合中
//更新distenceFor(j0ton)
If(s[j]为0并且点j到点u的距离c[u][j]小于1000)
newdist←distence[u]+c[u][j];
If(newdist<
distence[j])
distence[j]←newdist;
//更新起点到第j个点的最短路径
prev[j]←u;
//更新第j个点的前一个点
searchPath函数(用于表示当前点的前一个点的数组prev,起点v,intu)
intque[56];
tot←1;
que[tot]←u;
tot自增;
tmp←prev[u];
当(tmp不等于v)
que[tot]←tmp;
tmp←prev[tmp];
que[tot]←v;
For(itotto1)If(i不等于1)
s[que[i]]<
换行;
change_train函数()
distence[56];
记录起点到当前点的最短路径
prev[56];
记录当前点的前一个结点
path[56][56];
记录路径
matrix[56][56];
用于备份的矩阵
arrAcc[56][56];
邻接矩阵
g.verCount=56;
//定义总的站点的数目+1For(i0to56)
distence[i]←max;
//初始化邻接矩阵
For(i0tog.verCount(56)){For(k0tog.verCount(56))
If(i与k相同)
g.arrAcc[i][k]=0;
g.arrAcc[i][k]=max;
//输入A环线各点连接情况,每个边权重都为1
a[20]={0,1,2,49,3,4,5,6,7,50,8,9,10,11,51,12,13,14,52,15};
For(i0to19)
g.arrAcc[a[i]][a[i+1]]←1;
g.arrAcc[a[i+1]][a[i]]←1;
//输入B线各点连接情况,每个权重都为1
b[19]={16,53,17,18,19,20,50,21,22,23,24,25,26,51,27,28,54,29,30};
//19个点
For(i0to18)
g.arrAcc[b[i]][b[i+1]]←1;
g.arrAcc[b[i+1]][b[i]]←1;
//输入C线各点连接情况,每个权重都为1
c[23]={31,32,33,34,35,49,36,37,38,39,40,53,41,42,43,54,44,45,52,46,47,48,31};
//23
个点(因为是环线,所以点数加一)
For(i0to22)
g.arrAcc[c[i]][c[i+1]]←1;
g.arrAcc[c[i+1]][c[i]]←1;
For(i0to56){For(j0to56)
arrAcc[i][j]←g.arrAcc[i][j];
//因为使用完弗洛伊德算法之后,g.arrAcc的返回值已经变化了,
//故在此将g.arrAcc中的值都赋值给matrix二维数组中,进行备份
For(i0to56){For(j0to56)
matrix[i][j]←g.arrAcc[i][j];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第二次 试验 地铁 换乘