本科课程参见:《软件学院那些课》
问题描述
设计一个校园导游程序, 为来访的客人提供信息查询服务。
基本要求
(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息,以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询;
(3)为来访客人提供从校门口到图中任意景点的问路查询;
算法思想
图的表示采用最基本的邻接矩阵的表示方式为,矩阵中A(i,j)值表示图中点i与j之间权值,A(i,i)记为0,若没有通路,记为infinity = 10000。忽略图数据结构实现中不必要的细节,只提供最基本的功能,包括
int get_count();//得到图中顶点数目;
void read(char* fname);
//从文件读入并设置图中顶点邻接矩阵权值;
void write();//输出临界矩阵
void set_distances(Vertex source,
Weight distance[],Vertex ways[13][13]) const;
//得到由指定点到图中各点最短路径及值
单源最短路径算法使用经典的Krim算法,首先初始化各点到源点的路径为直接路径,路径值为源点到各顶点权值。之后选取路径值最短的点(设为点k),并通过数组found[n]记录每个点是否被找到的信息。选取一个点之后遍历每个未找到的点,如果由源点经点k再到某点路径值短于原记录路径值,则更新源点到其路径为经过k,路径值为源点到k路径值加上k点到此点路径值,再选取新路径数组中路径值最短的点;重复操作直至图中所有的点都被找到。
template <class Weight, int graph_size>
void Digraph<Weight, graph_size>::set_distances(Vertex source,
Weight distance[],Vertex ways[13][13]) const
//输出:数组array用以记录源点source到每个点的最短路径的值
// 二维数组ways用以记录源点到每个点最短路径所经过的点(即到达方式)
{
Vertex v, w;
bool found[graph_size]; // 存放找到的顶点
Vertex minways[graph_size];//存放当前找到的最短路径的走法
//初始化各个顶点的信息
//每个顶点均为未找到,其最短路径开始设为源点直接到此点的路径,
//走法为源点直接到此点
for (v = 0; v < count; v++) {
found[v] = false;
distance[v] = adjacency[source][v];
ways[v][0]=0;
ways[v][1]=v;
minways[v]=infinity;
for(w=2;w<count;w++)
ways[v][w]=infinity;
}
//初始化源点,默认其为找到点,最短路径为0
found[source] = true;
distance[source] = 0;
//最外层的循环每循环一次会找到一个顶点
for (int i = 0; i < count-1; i++) {
Weight min = infinity;
minways[0]=0;
//此循环判断出当前还为被找到的顶点的最短路径
//然后将此顶点设为已找到的点,其路径设为min,其走法设为minways
//注意此处的关键是因为每次循环之后每个未找到点的“最短路径”都相应新的集合做了改变
for (w = 0; w < count; w++){ if (!found[w])
if (distance[w] < min) {
v = w;
min = distance[w];
for(int j=0;j<count;j++)
minways[j]=ways[v][j];
}
}
found[v] = true;
//此循环用以修改未找到的点的最短路径
//如果在找到的点中min+刚找到的点到此点的路径小于原来的最短路径,
//则改变最短路径的值以及最短走法
//即刚新点后新的集合到点的路径优化原来的路径,则改变最短路径的值
for (w = 0; w < count; w++) if (!found[w])
if (min + adjacency[v][w] < distance[w]){
distance[w] = min + adjacency[v][w];
int a=0;
while(minways[a]<infinity){
ways[w][a]=minways[a];
a++;
}
ways[w][a]=w;
}
}
}
单源最短路径Krim算法流程
对于界面,因为功能并不复杂,我们使用Ezwin类库。
实现思路很简单,首先生成一个以虎溪校园平面为背景的窗口,右侧为景点按钮,点击按钮会生成景点介绍的窗口,相应的按钮加载相应景点的介绍图片,同时原窗口加载路径图。
最好的程序未必用最复杂的代码,我们认为精简优于繁杂,实现目的是王道!我们的校园景点查询系统通篇代码只有200行左右!
模块划分
1、classDigraph 定义图,其中单源最短路径算法最为其成员函数实现
2、主函数中实现图的初始化及窗口的生成和事件的响应
数据结构
typedef int Vertex;
//infinity用以表示两路之间没有同路的值
const int infinity = 10000;
//创建Diagrah类表示图
template <class Weight, int graph_size>
class Digraph {
public:
Digraph();
void read(char* fname);
void write();
int get_count();
void set_distances(Vertex source, Weight distance[],Vertex ways[13][13]) const;
protected:
int count; //图中点的数目
Weight adjacency[graph_size][graph_size];//相邻点之间的权值
};
测试情况
1、打开程序
开始界面:
2、查询景点“图书馆”
显示景点介绍窗口,并同时在原路径图显示从北门到图书馆的最短路径
项目演示
(*点击图片可跳转到youku视频)
分享到:
相关推荐
重庆大学虎溪校区的虎溪共享,可以不用校园网,一根网线就能下载资源。
虎溪共享平台
虎溪对战平台客户端 重庆大学网络信息协会 2010.04
重大虎溪图书馆.pdf
重庆大学共享神器 免流量校内大量资源任意下载 直接点击打开 搜索关键字即可
内涵重庆大学虎溪共享步骤及完美截图 使用于新老校区 欢迎大家使用
重庆大学学生用着很方便的共享资源。上面资源丰富,觉得有用可以试试的。
不封装防代理,可设无线wifi。由于是破解版,金山毒霸可能会报毒,添加信任即可。360杀毒可通过。
虎溪小学数学学业水平模拟试卷及答案精选.doc
虎溪小学英语学业水平模拟试卷及答案精选.doc
方便重庆大学的所有同学使用网络
数学知识考试试卷及答案
碰撞预警系统第二次实验方案1 实验概况1.1 实验时间地点 实验时间:2018年9月26日星期三实验地点: 重庆市沙坪坝区虎溪花园小区内某十字路口1.2 实验目
韩国奥库株式会社成立于2003年,总部位于韩国京畿道安阳市东安区虎溪洞1207-14号奥库大厦。奥库会社通过20余年的研发与创新,率先在韩国开发了21世纪世界上最先进的家用健康食品制造机---奥库隔水炖煮锅。 奥库公司...
本项目的登录方式源于,感谢该脚本作者提供此idea。所依赖的软件包:iproute2curl所需要...使用方法:sudo suvi main.py# 根据自己的情况修改config部分python3 main.py已经过测试的学校:重庆大学A区重庆大学虎溪校区
关于电子杂志制作实例,有助于更好的制作电子杂志