|
|
|
@ -5,16 +5,12 @@
|
|
|
|
|
杨腾泽,刘鑫成,李培毅,孙英皓
|
|
|
|
|
|
|
|
|
|
**摘要**:
|
|
|
|
|
|
|
|
|
|
(1) 基于真实的公路数据建立导航地图模型,编制成格式简单的数据文件包括城市线路名称、站点名称。
|
|
|
|
|
(2)系统能够读取公路导航地图数据文件,建立公路模型,也能够将模型输出成数据文件,以便验证模型的正确性。
|
|
|
|
|
(3)通过人机交互的方式输入起点和终点站名称,系统给出路径长度最短的导航路径。
|
|
|
|
|
(4)能够读取不同的地铁导航地图进行功能测试。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 1. 系统分析
|
|
|
|
|
通过各种算法,实现公路导航
|
|
|
|
|
|
|
|
|
@ -53,7 +49,7 @@
|
|
|
|
|
|
|
|
|
|
系统中需要读取以下文件以获得城市的边信息数据
|
|
|
|
|
|
|
|
|
|
creat.cpp
|
|
|
|
|
creat.h
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
功能:创建图结构
|
|
|
|
@ -61,7 +57,7 @@
|
|
|
|
|
输出:无
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function.cpp
|
|
|
|
|
function.h
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
功能:连接任意两个点
|
|
|
|
@ -74,7 +70,7 @@
|
|
|
|
|
输入:选择的功能编号
|
|
|
|
|
输出:返回一个值给main函数
|
|
|
|
|
|
|
|
|
|
short.cpp
|
|
|
|
|
short.h
|
|
|
|
|
|
|
|
|
|
功能:用Dijkstra算法求给出的一点到其余个点的最短路径
|
|
|
|
|
输入:源点
|
|
|
|
@ -82,11 +78,6 @@ short.cpp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
功能:用floyd算法求给出的两点之间的最好费用
|
|
|
|
|
输入:出发地,目的地
|
|
|
|
|
输出:地点的最少费用以及路径
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### (4)参数设定
|
|
|
|
|
|
|
|
|
|
构建图结构给图中点位赋予编号,名称,简介
|
|
|
|
@ -97,7 +88,7 @@ short.cpp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
功能:修改城市信息
|
|
|
|
|
输入:要修改的城市编号,以及修改后的城市信息
|
|
|
|
|
输入:要修改的城市编号
|
|
|
|
|
输出:无
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -116,28 +107,6 @@ short.cpp
|
|
|
|
|
|
|
|
|
|
首先,分析对比几种可选的数据结构设计方案。如图可以采用邻接矩阵,也可以采用邻接表,表示集合可以用普通的查找表,还可以用不相交集。给出每一种设计方案的特点(优势、不足等)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。
|
|
|
|
|
|
|
|
|
|
### (1)xxx结构
|
|
|
|
|
|
|
|
|
|
给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。多个数据结构,逐一列出。
|
|
|
|
|
|
|
|
|
|
### (2)xxx结构
|
|
|
|
|
|
|
|
|
|
给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。
|
|
|
|
|
|
|
|
|
|
###
|
|
|
|
|
|
|
|
|
|
## 2.3 算法设计
|
|
|
|
|
|
|
|
|
|
首先,分析对比几种可选的算法设计方案。如是否排序,广度优先或深度优先搜索等。给出每一种设计方案的特点(优势、不足)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。
|
|
|
|
|
|
|
|
|
|
### (1)XXX算法
|
|
|
|
|
|
|
|
|
|
给出核心算法的设计,包括伪代码或流程图。多个核心算法,逐一列出。只列举解决问题的核心算法,重点讲清楚是如何解决问题的。
|
|
|
|
|
|
|
|
|
|
### (2)XXX算法
|
|
|
|
|
|
|
|
|
|
给出核心算法的设计,包括伪代码或流程图。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 系统实现
|
|
|
|
@ -238,47 +207,7 @@ int Ppath1(MatGrath &G,int path[][MAXV],int v,int w) //前向递归查找
|
|
|
|
|
Ppath1(G,path,k,w); //找顶点k的前一个顶点j
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
如下采用floyd算法求给出的两点之间的最少费用
|
|
|
|
|
```
|
|
|
|
|
void ShortestMoney(MatGrath &G,int v,int w)//求花费最少的路径
|
|
|
|
|
{
|
|
|
|
|
int A[MAXV][MAXV],path[MAXV][MAXV];
|
|
|
|
|
int i,j,k;
|
|
|
|
|
for (i=0; i<G.vexnum; i++)
|
|
|
|
|
for (j=0; j<G.vexnum; j++)
|
|
|
|
|
{
|
|
|
|
|
A[i][j]=G.arc[i][j].money;
|
|
|
|
|
path[i][j]=-1; //i到j没有边
|
|
|
|
|
}
|
|
|
|
|
for (k=0; k<G.vexnum; k++)
|
|
|
|
|
{
|
|
|
|
|
for (i=0; i<G.vexnum; i++)
|
|
|
|
|
for (j=0; j<G.vexnum; j++)
|
|
|
|
|
if (A[i][j]>A[i][k]+A[k][j])
|
|
|
|
|
{
|
|
|
|
|
A[i][j]=A[i][k]+A[k][j];
|
|
|
|
|
path[i][j]=k;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (A[v][w]==INF)
|
|
|
|
|
{
|
|
|
|
|
if (v!=w)
|
|
|
|
|
printf("从%d到%d没有路径\n",v,w);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
printf(" 从%s到%s路径费用:%d元人民币 路径:",G.vexs[v].sight,G.vexs[w].sight,A[v][w]);
|
|
|
|
|
printf("%s->",G.vexs[v].sight); //输出路径上的起点
|
|
|
|
|
Ppath1(G,path,v,w); //输出路径上的中间点
|
|
|
|
|
printf("%s\n",G.vexs[w].sight); //输出路径上的终点
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 3.2 核心算法的实现
|
|
|
|
@ -363,47 +292,6 @@ int Ppath1(MatGrath &G,int path[][MAXV],int v,int w) //前向递归查找
|
|
|
|
|
Ppath1(G,path,k,w); //找顶点k的前一个顶点j
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
如下采用floyd算法求给出的两点之间的最少费用
|
|
|
|
|
```
|
|
|
|
|
void ShortestMoney(MatGrath &G,int v,int w)//求花费最少的路径
|
|
|
|
|
{
|
|
|
|
|
int A[MAXV][MAXV],path[MAXV][MAXV];
|
|
|
|
|
int i,j,k;
|
|
|
|
|
for (i=0; i<G.vexnum; i++)
|
|
|
|
|
for (j=0; j<G.vexnum; j++)
|
|
|
|
|
{
|
|
|
|
|
A[i][j]=G.arc[i][j].money;
|
|
|
|
|
path[i][j]=-1; //i到j没有边
|
|
|
|
|
}
|
|
|
|
|
for (k=0; k<G.vexnum; k++)
|
|
|
|
|
{
|
|
|
|
|
for (i=0; i<G.vexnum; i++)
|
|
|
|
|
for (j=0; j<G.vexnum; j++)
|
|
|
|
|
if (A[i][j]>A[i][k]+A[k][j])
|
|
|
|
|
{
|
|
|
|
|
A[i][j]=A[i][k]+A[k][j];
|
|
|
|
|
path[i][j]=k;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (A[v][w]==INF)
|
|
|
|
|
{
|
|
|
|
|
if (v!=w)
|
|
|
|
|
printf("从%d到%d没有路径\n",v,w);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
printf(" 从%s到%s路径费用:%d元人民币 路径:",G.vexs[v].sight,G.vexs[w].sight,A[v][w]);
|
|
|
|
|
printf("%s->",G.vexs[v].sight); //输出路径上的起点
|
|
|
|
|
Ppath1(G,path,v,w); //输出路径上的中间点
|
|
|
|
|
printf("%s\n",G.vexs[w].sight); //输出路径上的终点
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 4. 系统测试
|
|
|
|
|