一、问题描述
1. 题目内容:校园导游咨询(为来访的客人提供各种信息服务)
2. 基本要求:
1、设计淮阴师范学院北校区平面图,在校园景点不低于10个。以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。
2、为来访客人提供图中任意景点相关信息的查询。
3、为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。
二、需求分析
1. 本程序的功能包括校园地图的建立,景点的信息查询,最短路径查询,所有路径的输出,所有路径的长度的输出以及退出系统等。
2. 程序运行后显现提示信息,等候用户输入0—4以进入相应的操作功能。
3. 用户输入数据完毕,程序将输出运行结束。
4. 测试数据应为景点的代号,景点之间的最短路径,景点的名称。
三、概要设计
1. 带头结点的无向图数据类型定义为:
数据集合
vertex a[Maxsize];景点信息
int arc[Maxsize][Maxsize];两点距离
int vertexNum, arcNum;景点数,边数
int dist[Maxsize][Maxsize];最短路径长度
string path[Maxsize][Maxsize];最短路径
操作集合:
(1) MGraph(int n, int e);初始化数据
(2) void Seek(int i);景点信息查询
(3) void Floyd();初始化路径和路径长度
(4) void Allpaths();输出所有路径
(5) void Allpathlengths();输出所有路径长度
(6) void Printshortpath();最短路径的查询
四、数据结构设计
1. 元素类型,结点类型,指针类型
typedef struct
{
string code;
string name;
string intro;
}vertex;
五、算法设计
1、算法分析(必须要用语言进行描述)
整个程序主要的算法体现在最短路径,所以我们初始化最短路径以及最短路径长度,计算任意两点之间的最短路径。
2、算法实现
void MGraph::Floyd()
{
int i, j, k;
for (i = 0; i < vertexNum; i++)
for (j = 0; j < vertexNum; j++)
{
dist[i][j] = arc[i][j];
if (dist[i][j] != 10000)
path[i][j] = a[i].code + a[j].code;
else path[i][j] = " ";
}
for (k = 0; k < vertexNum; k++)
for (i = 0; i < vertexNum; i++)
for (j = 0; j < vertexNum; j++)
if (dist[i][k] + dist[k][j] < dist[i][j])
{
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = path[i][k] + "-" + path[k][j];
}
}
3、算法流程图
六、程序测试与实现
1、函数之间的调用关系
2、主程序
int main()
{
MGraph m(11, 18);
meau();
int choice;
while (true)
{
cout << "请输入您要执行功能的编号:";
cin >> choice;
switch (choice)
{
case 1:
cout << "****************************************" << endl;
cout << "***景点代号: ***" << endl;
cout << "***a南苑食堂 b操场 c生化楼 ***" << endl;
cout << "***d崇文楼 e教科学院 f音乐学院 ***" << endl;
cout << "***g图书馆 h体育学院 i南门 ***" << endl;
cout << "***j北门 k弘文楼 ***" << endl;
cout << "****************************************" << endl;
cout << "编号如上图,请输入您要查询景点的编号:";
int code;
cin >> code;
m.Seek(code);
break;
case 2:m.Floyd();
m.Printshortpath();
break;
case 3:m.Floyd();
m.Allpaths();
break;
case 4:m.Floyd();
m.Allpathlengths();
break;
case 0:return 0;
default:
cout << "输入非法,已退出程序";
return 0;
break;
}
}
return 0;
}