您好,欢迎来到99网。
搜索
您的当前位置:首页数据结构实验报告-交通指南

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

来源:99网
- . -

数 据 结 构 课 程 实 验 报 告

班级:计嵌141

:志远

.可修编-

- . -

学号:1413052023

交通指南系统

1.问题描述

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

2.基本要求

(1)设计结点和图的存储结构; (2)设计任意两点最短路径方法;

(3)输入:图的相关信息以建立公交线路网,以及公交线路网咨询的任意两个站点; (4)输出:两个站点间一条最短的简单路径。

3.实现提示

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

typedef struct node { int no; float wgt;

struct node*next; }edgenode;

typedef struct { char vtx;

edgenode*link; } vexnode;

typedef vexnode Graph[n];

void Floyd(Graph G,float A[n][n],int p[n][n]) { int i,j,k;

for(i=0;ifot(j=0;jfor(k=0;kfor(i=0;ifor(j=0;jif(A[i][k]+A[k][j]A[i][j]=A[i][k]+A[k][j];

.可修编-

- . -

}

}

(2)算法提示

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

4.源代码

#include using namespace std;

struct ArcCell {

int adj; //存放弧长

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

struct _MGraph {

char vexs[20]; //存放站点 ArcCell arcs[20][20]; // int vexnum; int arcnum;

};

typedef int Path[20][20][20];

.可修编-

- . -

typedef int Distanc[20][20];

class MGraph //没用私有成员 { public: };

bool MGraph::CreateDN()//构造有向网 {

int i,j ,w; char v1, v2;

cout<<\"请输入站点个数,直接可达线路的条数: \"; cin>>mgraph.vexnum>>mgraph.arcnum ; cout<<\"\\n请输入各站点名: \";

for(i = 0;icin>>mgraph.vexs[i];

_MGraph mgraph;//

void DestroyGraph(); //析构函数销毁图 int LocateVex (char u); // 返回顶点在图中的位置 bool CreateDN(); //构造有向网 void ShortestPath_FLOYD(Path &P,Distanc &D);

.可修编-

- . -

}

for(i = 0;ifor(j = 0;jif(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;icout<<\"\\n请输入其中一条线路的起点站点名,终点站点名,需要时间(分}

钟): \";

}

cin>>v1>>v2>>w; int m = LocateVex(v1); int n = LocateVex(v2);

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

.可修编-

- . -

return true;

}

void MGraph::DestroyGraph() { for(int i = 0 ;i{

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

}

}

mgraph.vexnum = 0;

mgraph.arcnum = 0;

}

int MGraph::LocateVex(char u) {

.可修编-

- . -

}

for(int i = 0 ;i<20;i++) { } return -1;

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

return i;

void MGraph::ShortestPath_FLOYD(Path &P,Distanc &D)//求每对顶点间的最短路径 // 用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]

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

int u,v,w,i;

for(v = 0;vfor(w = 0;wD[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;ufor(v = 0;vfor(w = 0;wif(D[v][u]+D[u][w]D[v][w] = D[v][u]+D[u][w];// 更新最短距离 for(i = 0;iP[v][w][i] = P[v][u][i]||P[u][w][i];//从v到w的路径经过//从v经u到w的一条路径更短

从v到u和从u到w的所有路径

}

.可修编-

- . -

}

}

}

}

void main() {

MGraph g; Path p; // 3维数组 Distanc d; // 2维数组 int s,t,k; char v1,v2; float sum=0;

cout<<\"\\n***************欢迎使用交通指南系统**************\\n\"<cout<<\"\\n请依次输入您的出发站和目的站站点名称:\";

cin>>v1>>v2; s=g.LocateVex (v1); t=g.LocateVex (v2);

g.ShortestPath_FLOYD(p,d);

if(s!=t)

.可修编-

- . -

{

int a=s;

cout<<\"\\n

\"<

\"<}

for(k = 0;kif(p[s][t][k] == 1) { }

cout<cout<<\"最短时间:\"<cout<<\"\\n\\n***************感您的使用!*****************\"<cout<<\"\\n\\n***************祝您旅途愉快!*****************\"<5.实现

.可修编-

- . -

.可修编-

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务