【算法设计】虎溪校园导游系统

来源:互联网 发布:预测数据的方法 编辑:程序博客网 时间:2024/04/28 06:56

问题描述

设计一个校园导游程序, 为来访的客人提供信息查询服务。

基本要求

(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息,以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询;
(3)为来访客人提供从校门口到图中任意景点的问路查询;

算法思想

图的表示采用最基本的邻接矩阵的表示方式为,矩阵中A(i,j)值表示图中点i与j之间权值,A(i,i)记为0,若没有通路,记为infinity = 10000。忽略图数据结构实现中不必要的细节,只提供最基本的功能,包括
[cpp] view plaincopy
  1. int get_count();//得到图中顶点数目;  
  2. void read(char* fname);  
  3. //从文件读入并设置图中顶点邻接矩阵权值;  
  4. void write();//输出临界矩阵  
  5. void set_distances(Vertex source,   
  6. Weight distance[],Vertex ways[13][13]) const;     
  7. //得到由指定点到图中各点最短路径及值  

单源最短路径算法使用经典的Krim算法,首先初始化各点到源点的路径为直接路径,路径值为源点到各顶点权值。之后选取路径值最短的点(设为点k),并通过数组found[n]记录每个点是否被找到的信息。选取一个点之后遍历每个未找到的点,如果由源点经点k再到某点路径值短于原记录路径值,则更新源点到其路径为经过k,路径值为源点到k路径值加上k点到此点路径值,再选取新路径数组中路径值最短的点;重复操作直至图中所有的点都被找到。
[cpp] view plaincopy
  1. template <class Weight, int graph_size>  
  2. void Digraph<Weight, graph_size>::set_distances(Vertex source,  
  3.                                         Weight distance[],Vertex ways[13][13]) const  
  4. //输出:数组array用以记录源点source到每个点的最短路径的值  
  5. //      二维数组ways用以记录源点到每个点最短路径所经过的点(即到达方式)  
  6. {  
  7.     Vertex v, w;  
  8.     bool found[graph_size]; // 存放找到的顶点  
  9.     Vertex minways[graph_size];//存放当前找到的最短路径的走法  
  10.   
  11.     //初始化各个顶点的信息  
  12.     //每个顶点均为未找到,其最短路径开始设为源点直接到此点的路径,  
  13.     //走法为源点直接到此点  
  14.     for (v = 0; v < count; v++) {  
  15.         found[v] = false;  
  16.         distance[v] = adjacency[source][v];  
  17.         ways[v][0]=0;  
  18.         ways[v][1]=v;  
  19.         minways[v]=infinity;  
  20.         for(w=2;w<count;w++)  
  21.         ways[v][w]=infinity;  
  22.     }  
  23.     //初始化源点,默认其为找到点,最短路径为0  
  24.     found[source] = true;   
  25.     distance[source] = 0;  
  26.     //最外层的循环每循环一次会找到一个顶点  
  27.     for (int i = 0; i < count-1; i++) {   
  28.           
  29.         Weight min = infinity;  
  30.         minways[0]=0;  
  31.           
  32.         //此循环判断出当前还为被找到的顶点的最短路径  
  33.         //然后将此顶点设为已找到的点,其路径设为min,其走法设为minways  
  34.         //注意此处的关键是因为每次循环之后每个未找到点的“最短路径”都相应新的集合做了改变  
  35.         for (w = 0; w < count; w++){ if (!found[w])  
  36.             if (distance[w] < min) {  
  37.                 v = w;  
  38.                 min = distance[w];  
  39.                 for(int j=0;j<count;j++)  
  40.                     minways[j]=ways[v][j];  
  41.             }  
  42.         }  
  43.         found[v] = true;  
  44.           
  45.         //此循环用以修改未找到的点的最短路径  
  46.         //如果在找到的点中min+刚找到的点到此点的路径小于原来的最短路径,  
  47.         //则改变最短路径的值以及最短走法  
  48.         //即刚新点后新的集合到点的路径优化原来的路径,则改变最短路径的值  
  49.         for (w = 0; w < count; w++) if (!found[w])  
  50.             if (min + adjacency[v][w] < distance[w]){  
  51.                 distance[w] = min + adjacency[v][w];  
  52.                 int a=0;  
  53.                 while(minways[a]<infinity){  
  54.                     ways[w][a]=minways[a];  
  55.                     a++;  
  56.                 }  
  57.                 ways[w][a]=w;  
  58.             }  
  59.     }  
  60. }  

单源最短路径Krim算法流程


对于界面,因为功能并不复杂,我们使用Ezwin类库。
实现思路很简单,首先生成一个以虎溪校园平面为背景的窗口,右侧为景点按钮,点击按钮会生成景点介绍的窗口,相应的按钮加载相应景点的介绍图片,同时原窗口加载路径图。
最好的程序未必用最复杂的代码,我们认为精简优于繁杂,实现目的是王道!我们的校园景点查询系统通篇代码只有200行左右!

模块划分

1、      classDigraph 定义图,其中单源最短路径算法最为其成员函数实现

2、      主函数中实现图的初始化及窗口的生成和事件的响应


数据结构

[cpp] view plaincopy
  1. typedef int Vertex;  
  2. //infinity用以表示两路之间没有同路的值  
  3. const int infinity = 10000;  
  4.   
  5. //创建Diagrah类表示图  
  6. template <class Weight, int graph_size>  
  7. class Digraph {  
  8. public:  
  9.     Digraph();  
  10.     void read(char* fname);  
  11.     void write();  
  12.     int get_count();  
  13.     void set_distances(Vertex source, Weight distance[],Vertex ways[13][13]) const;  
  14. protected:  
  15.     int count;   //图中点的数目  
  16.     Weight adjacency[graph_size][graph_size];//相邻点之间的权值  
  17. };  

测试情况

1、打开程序
开始界面:

2、查询景点“图书馆”
显示景点介绍窗口,并同时在原路径图显示从北门到图书馆的最短路径


3、各景点路径详细信息


项目演示


(*点击图片可跳转到youku视频)

代码资料下载:http://download.csdn.net/detail/xiaowei_cqu/5068423
0 0
原创粉丝点击