数据结构第四次实验

12 篇文章 5 订阅
2 篇文章 0 订阅

实验题目:校园导游咨询

实验目的

掌握图的存储方法和最短路经算法。

实验内容

设计一个校园导游程序,为来访客人提供各种信息查询服务。测试数据根据实际情况指定。提示:一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向图。顶点和边均含有相关信息。

实验要求

  1. 设计所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。 2. 为来访客人提供图中任意景点相关信息的查询。
  2. 为来访客人提供图中任意景点的纹路查询,即查询任意两个景点之间的一条最短的简单路径。

实验内容

需求分析

为了能够更好的展现学校的信息,表示学校内部各个景点的信息和路径信息。我设计了一个校内咨询网页,这个网页内部包括学校的地图,12个景点的信息,还有每两个景点之间的最短路径。

学校地图
在这里插入图片描述
输入信息

  1. 景点介绍
    当用户需要了解景点信息时,需要点击了解景点的单选框。
  2. 最短路径
    当用户想要访问两个顶点的最短路径时,需要输入(选择)起点和终点。

输出信息

  1. 景点介绍
    用户选中后,页面显示景点的图片和介绍。
  2. 最短路径
    用户选择了起点和终点之后,在页面上输出最短路径信息。

概要设计

信息存储
我们的信息存储主要有两个部分:景点信息和路径信息。

  1. 景点信息
    为了使得网页上的访问更加方便,我们不能用一般的数组或结构体来存储景点的信息。这里我选择的XML结构来保存景点信息。里面有景点的名称、介绍等等。
    在这里插入图片描述
  2. 路径信息
    为了保存路径,我将景点和景点之间的边保存在了一个邻接矩阵里面。

最短路径的算法
由于本次设计需要用户输入起点和终点,也是就是说需要求任意两点之间的最短路径。所以我们使用Floyd算法来求任意两点之间的最短路径。

详细设计

为了侧重重点,我在实验报告里不再展示网页设计相关的代码,只展示算法的代码部分。

邻接矩阵

static int inf = 0x3f3f3f;
        public int[,] Arr = new int[12, 12] {
            { 0, inf,inf,inf,inf,inf, 1,inf,inf,inf,inf,inf },
            { inf, 0, 1 ,inf,inf,inf, 1,inf,inf,inf,inf,inf },
            { inf, 1,0 , 5 ,inf, 3, inf,inf,inf,inf,inf,inf },
            { inf,inf,5,0,inf,inf, inf,inf,inf,inf,12,inf },
            { inf, inf,inf,inf,0,inf, inf,inf,inf,inf,2,2   },
            { inf, inf,3,inf,inf,0, inf,inf,inf,2,inf,inf },
            { 1, 1,inf,inf,inf,inf, 0, 1,inf,inf,inf,inf },
            { inf, inf,inf,inf,inf,inf, 1,0,1,2,inf,inf },
            { inf, inf,inf,inf,inf,inf, inf,1,0,inf,1,2 },
            { inf, inf,inf,inf,inf,2, inf,2,inf,0,2,inf },
            { inf, inf,inf,inf,2,inf, inf,inf,1,2,0,3 },
            { inf, inf,inf,inf,inf,inf, inf,inf,2,inf,3,0 },
        };

路径保存
我们用一个-1的矩阵来保存路径

public int[,] path = new int[12, 12] {
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
            {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
        };

最短路算法
采用Floyd算法

public void Shortest()
        {
            for (int k = 0; k < 12; k++)
                for (int i = 0; i < 12; i++)
                    for (int j = 0; j < 12; j++)
                        if(Arr[i, j] >  Arr[i, k] + Arr[k, j])
                        {
                            Arr[i, j] = Arr[i, k] + Arr[k, j];
                            path[i, j] = k;
                        }
            string p = DropDownList1.SelectedValue.ToString();
            string[]p1 = p.Split('-');
            string q = DropDownList2.SelectedValue.ToString();
            string[] q1 = q.Split('-');
            int pp = int.Parse(p1[0]);
            int qq = int.Parse(q1[0]);
            if(Arr[pp,qq]!=inf)
            {
                label1.Text = "";
                label1.Text += p1[0] + p1[1] + "->";
                print(pp, qq);
                label1.Text += q1[0] + q1[1];
            }
            
            label2.Text = DropDownList1.SelectedItem.Text + "->" + DropDownList2.SelectedItem.Text + "的最短路径是" + Arr[pp, qq];
        }

路径输出

public void print(int a, int b)
        {
            if (path[a,b] == -1) return;//因为开始初始化为-1,这里就可以避免相邻的再次输出 
            print(a, path[a,b]);//前半部 
            //cout << path[a,b] << "-->";//输出该点
            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath("~/App_Data/cons.xml"));
            XmlNode xn = doc.SelectSingleNode("Constellation");
            XmlNodeList xnl = xn.ChildNodes;
            // 遍历子节点
            foreach (XmlNode xnd in xnl)
            {
                // 运用实体类保存信息
                ConsModel cm = new ConsModel();
                XmlElement xe = (XmlElement)xnd;
                XmlNodeList xnl0 = xe.ChildNodes;
                cm.ConsNum = xnl0.Item(0).InnerText;
                cm.ConsName = xnl0.Item(1).InnerText;
                if(path[a,b].ToString()==cm.ConsNum)
                {
                    label1.Text += path[a, b] + cm.ConsName+"->";
                    break;
                }
                    
            }
            print(path[a,b], b);//后半部 
        }

调试分析

问题及解决办法

  1. 网页设计遇到的问题和解决办法
    遇到最大的问题就是我本人对于前端设计不算了解,不能实现较为复杂的页面。我在调控一些网页控件时也遇到了对功能不了解而出现的错误。

    我的解决办法就是尽可能简化网页设计部分,用最少的控件解决问题。

  2. 算法遇到的问题和解决办法
    算法遇到的最大的问题就是路径的输出。根据Floyd算法,可以很简单的求出每两个点之间的最短路径。但是输出是个问题。

    经过一番思考,我在求解最短路径的时候记录下节点的信息,然后在求解的时候用递归输出。

算法的时空分析

  1. 空间复杂度
    由于邻接矩阵的存在,空间复杂度至少是 N 2 N^2 N2的。在这里我选择了12个景点,空间复杂度还可以接受。
  2. 时间复杂度
    由于我使用了floyd算法,时间复杂度就是 O ( N 3 ) O(N^3) O(N3)。但我的景点数是12个,所以这个时间复杂度还是可以接受的。

实验结果

欢迎界面
在这里插入图片描述
景点选择界面
在这里插入图片描述
展示景点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最短路查询
在这里插入图片描述

在这里插入图片描述

实验总结

通过这个实验我有以下体会

  1. 我学会使用了多源最短路径之一的floyd算法,该算法形式简单,但对于数据规模较大的数据来说,时间复杂度较高。
  2. 我将数据结构面向对象化,制作网页很多时候需要用到面向对象的技术。我这次实验将面向对象和数据结构进行了一个结合,感觉使用起来更加的方便了。
  3. 我将.NET课上学到的ASP.NET 技术和数据结构与算法相结合,实现了技术上的交叉。
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实验报告含有:实验目的,问题描述,基本要求;概要设计:抽象数据类型定义,模块层次关系图;调试分析;floyed算法分析;用户使用说明;程序源代码及截图 (ps:该校园导游咨询系统没有输入值,所有信息是都在class MGraph的构造函数传输的,且校园景点信息皆为【【上海电力学院】】景点信息。请大家注意,直接从文章copy到visual stutio会出现文字符,注意删除,推荐大家在一行语句的分号后面,点出光标,按一下delete键,然后按一下enter键,完成visual stutio的自动对齐,这样程序看起来一目了然,更易于操作和更改) 【问题描述】 设计一个校园导游程序,为来访的客人提供各种信息查询服务。 【基本要求】 (1)设计你所在学校园平面图所含景点不少10个以图顶点表示内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。 (2)为来访客人提供图任意景点相关信息的查询。 (3)为来访客人提供图任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。 【选作内容】 (6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。 **************************【以下为类的定义】******************************** #include<iostream> #include<iomanip> using namespace std; const int MaxSize=18; const int INFINITY=65535;//最大值无穷 class direction; template <class T> class MGraph; template <class T> class VertexNode//定义头结点 { friend class MGraph<T>; public: int vex;//顶点名称 T vexname;//顶点名称 T vexinf;//顶点信息 direction dir;//存放顶点方位信息的direction类的dir。 }; class direction { public: int ln;//存放在方向图的横坐标,表示东西 int col;//存放在方向图的纵坐标,表示南北 }; template <class T> class MGraph//定义无向图的邻接矩阵 { public: MGraph(); //构造函数,初始化具有n个顶点的图 void printvexname();//显示所有景点及景点代号 void printvexinf(int i);//显示代号为i景点的名称及信息 void printroad(int i,int j);//显示景点i~j的最短路径方案信息 void printdir(int i,int j);//显示景点i到j的方向信息,如“向东100m,向南200m” VertexNode<T> adjlist[MaxSize]; //存放景点全部信息的 景点类数组 int vertexNum,arcNum; //图的顶点数和边数 void Root(int p,int q);//递归寻找pq间的最短路径 int Path[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//创建Path和Dist分别存放两点间最短路径的前驱节点,两点间最短路径长度 int Line[MaxSize];//Line存放路径 int kkk;//Line[]数组的标记 private: T vertex[MaxSize]; //存放图顶点的数组 int arc[MaxSize][MaxSize];//存放图边的数组 }; *************************【以下为类的实现 即类函数的定义】*********************************** 详细实验报告内容 程序源代码 及运行截图在文档有,请下载~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值