数据结构实验报告交通指南.docx

上传人:b****3 文档编号:27159080 上传时间:2023-06-27 格式:DOCX 页数:9 大小:97.43KB
下载 相关 举报
数据结构实验报告交通指南.docx_第1页
第1页 / 共9页
数据结构实验报告交通指南.docx_第2页
第2页 / 共9页
数据结构实验报告交通指南.docx_第3页
第3页 / 共9页
数据结构实验报告交通指南.docx_第4页
第4页 / 共9页
数据结构实验报告交通指南.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构实验报告交通指南.docx

《数据结构实验报告交通指南.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告交通指南.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构实验报告交通指南.docx

数据结构实验报告交通指南

班级:

计嵌141

志远

学号:

1413052023

交通指南系统

1.问题描述

假设以一个带权有向图表示某一区域的公交线路图,图中顶点代表一些区域中的重要站点,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间),试设计一个交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一站点到达另一站点。

2.基本要求

(1)设计结点和图的存储结构;

(2)设计任意两点最短路径方法;

(3)输入:

图的相关信息以建立公交线路网,以及公交线路网咨询的任意两个站点;

(4)输出:

两个站点间一条最短的简单路径。

3.实现提示

(1)结点和图的存储结构

typedefstructnode

{intno;

floatwgt;

structnode*next;

}edgenode;

typedefstruct

{charvtx;

edgenode*link;

}vexnode;

typedefvexnodeGraph[n];

voidFloyd(GraphG,floatA[n][n],intp[n][n])

{inti,j,k;

for(i=0;i

fot(j=0;j

{A[i][j]=G[i][j];

P[i][j]=-1;

}

for(k=0;k

for(i=0;i

for(j=0;j

if(A[i][k]+A[k][j]

{p[i][j]=k;

A[i][j]=A[i][k]+A[k][j];

}

}

(2)算法提示

采用任意两点最短路径的相关算法。

4.源代码

#include

usingnamespacestd;

structArcCell

{

intadj;//存放弧长

bool*info;//是否用过该弧

};

struct_MGraph

{

charvexs[20];//存放站点

ArcCellarcs[20][20];//

intvexnum;

intarcnum;

};

typedefintPath[20][20][20];

typedefintDistanc[20][20];

classMGraph//没用私有成员

{

public:

_MGraphmgraph;//

voidDestroyGraph();//析构函数销毁图

intLocateVex(charu);//返回顶点在图中的位置

boolCreateDN();//构造有向网

voidShortestPath_FLOYD(Path&P,Distanc&D);

};

boolMGraph:

:

CreateDN()//构造有向网

{

inti,j,w;

charv1,v2;

cout<<"请输入站点个数,直接可达线路的条数:

";

cin>>mgraph.vexnum>>mgraph.arcnum;

cout<<"\n请输入各站点名:

";

for(i=0;i

{

cin>>mgraph.vexs[i];

}

for(i=0;i

{

for(j=0;j

{

if(i==j)

mgraph.arcs[i][j].adj=0;

else

mgraph.arcs[i][j].adj=20000;//infinity;

mgraph.arcs[i][j].info=false;

}

}

for(i=0;i

{

cout<<"\n请输入其中一条线路的起点站点名,终点站点名,需要时间(分钟):

";

cin>>v1>>v2>>w;

intm=LocateVex(v1);

intn=LocateVex(v2);

mgraph.arcs[m][n].adj=w;//的权值

}

 

returntrue;

}

voidMGraph:

:

DestroyGraph()

{

for(inti=0;i

for(intj=0;j

{

if(mgraph.arcs[i][j].info)

{

delete[]mgraph.arcs[i][j].info;

mgraph.arcs[i][j].info=false;

}

}

mgraph.vexnum=0;

mgraph.arcnum=0;

}

intMGraph:

:

LocateVex(charu)

{

for(inti=0;i<20;i++)

{

if(u==mgraph.vexs[i])

{

returni;

}

}

return-1;

}

voidMGraph:

:

ShortestPath_FLOYD(Path&P,Distanc&D)//求每对顶点间的最短路径

//用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]

//若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点。

{

intu,v,w,i;

for(v=0;v

{

for(w=0;w

{

D[v][w]=mgraph.arcs[v][w].adj;//顶点v到顶点w的直接距离

for(u=0;u

P[v][w][u]=false;//路径矩阵初值

if(D[v][w]<20000)//从v到w有直接路径

P[v][w][v]=P[v][w][w]=true;//由v到w的路径经过v和w两点

}

}

for(u=0;u

{

for(v=0;v

{

for(w=0;w

{

if(D[v][u]+D[u][w]

//从v经u到w的一条路径更短

{

D[v][w]=D[v][u]+D[u][w];//更新最短距离

for(i=0;i

P[v][w][i]=P[v][u][i]||P[u][w][i];//从v到w的路径经过从v到u和从u到w的所有路径

}

}

}

}

}

voidmain()

{

MGraphg;

Pathp;//3维数组

Distancd;//2维数组

ints,t,k;

charv1,v2;

floatsum=0;

cout<<"\n***************欢迎使用交通指南系统**************\n"<

g.CreateDN();

cout<<"\n请依次输入您的出发站和目的站站点名称:

";

cin>>v1>>v2;

s=g.LocateVex(v1);

t=g.LocateVex(v2);

g.ShortestPath_FLOYD(p,d);

if(s!

=t)

{

inta=s;

cout<<"\n由站点"<

";

for(k=0;k

if(p[s][t][k]==1)

{cout<

sum=sum+g.mgraph.arcs[a][k].adj;

a=k;

}

}

cout<<"最短时间:

"<

cout<<"\n\n***************感您的使用!

*****************"<

cout<<"\n\n***************祝您旅途愉快!

*****************"<

g.DestroyGraph();

}

 

5.实现

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1