虎溪校园导游系统
问题描述设计一个校园导游程序, 为来访的客人提供信息查询服务。基本要求(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息,以边表示路径,存放路径长度等相关信息。(2)为来访客人提供图中任意景点相关信息的查询;(3)为来访客人提供从校门口到图中任意景点的问路查询;算法思想图的表示采用最基本的邻接矩阵的表示方式为,矩阵中A(i,j)值表示图中点i与j之间权值,A(i,i)记为0,若没有通路,记为infinity = 10000。忽略图数据结构实现中不必要的细节,只提供最基本的功能,包括[cpp]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点到此点路径值,再选取新路径数组中路径值最短的点;重复操作直至图中所有的点都被找到。[cpp]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;}//初始化源点,默认其为找到点,最短路径为0found[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、 主函数中实现图的初始化及窗口的生成和事件的响应数据结构[cpp]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、查询景点“图书馆”显示景点介绍窗口,并同时在原路径图显示从北门到图书馆的最短路径上一个:poj-2635-The Embarrassed Cryptographer
下一个:(MFC)Vs2010制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊