【课程设计报告】题目0:设计校园两点之间的最小单元路径

来源:互联网 发布:mysql 远程连接 编辑:程序博客网 时间:2024/05/20 14:18

一、课题要求:

        GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。

二、课程设计的目录如下:

                   

三、源代码:

#include<iostream>

#include<vector>              

#include<string>

using namespace std;

#define MAX_VEX_NUM 20        

vector<string> allPath;

vector<int> all;

struct MGraph

{

       charvexs[MAX_VEX_NUM];    

    intarcs[MAX_VEX_NUM][MAX_VEX_NUM];   

       intvexnum,arcnum;

};

 

MGraph G;                      

int Locate_vex(MGraph G,char v) 

{

       int i=0;

       while(i<G.vexnum&& v!=G.vexs[i])

              i++;

       if(i<G.vexnum)

              returni;              

       else

              return-1;

}

 

int CreateUDG(MGraph &G)     //数组邻接矩阵表示法构造无向图

{

       charv1,v2;

       intweight;//权值

       cout<<"请输入图的顶点数和弧数"<<endl;

       cin>>G.vexnum>>G.arcnum;

       cout<<"请输入顶点值"<<endl;

       for(inti=0;i<G.vexnum;i++)              //构造顶点向量

              cin>>G.vexs[i];

    for(intq=0;q<G.vexnum;q++)            //初始化邻接矩阵

        for(int p=0;p<G.vexnum;p++)

               G.arcs[q][p]=0;

        for(int k=0;k<G.arcnum;k++)            //构造邻接矩阵

        {

               cout<<"输入该弧依附的顶点和权值:"<<endl;

               cin>>v1>>v2>>weight;

               int a=Locate_vex(G,v1);

               int b=Locate_vex(G,v2);

               G.arcs[a][b]=weight;

               G.arcs[b][a]=G.arcs[a][b];

        }

         for(int n=0;n<G.vexnum;n++)

                cout<<G.vexs[n]<<" ";

         cout<<endl;

         cout<<endl;

         cout<<"该图的邻接矩阵表示为:\n";

         for(int x=0;x<G.vexnum;x++)//输出邻接矩阵

         {

               for(int y=0;y<G.vexnum;y++)

                      cout<<G.arcs[x][y]<<" ";

                cout<<endl;

         }

         cout<<endl;

         cout<<endl;

      return 1;

}       

void Minway(MGraph G,bool *visited,char vexs,intLong,char vb,string path)  

//递归求取所有顶点a到顶点i的路径

{

       if(vexs==vb)                                             //递归结束条件

       {

           path=path+" "+vexs;

              allPath.push_back(path);                      //将路径放入向量中

              all.push_back(Long);                   //将路径长放入对应向量中

              cout<<"路径:"<<path<<"  长度:"<<Long<<endl;

       }

       else

       {

              path=path+""+vexs;

         int i=Locate_vex(G,vexs);

          visited[i]=true;

           for(int j=0;j<G.vexnum;j++)

                 if((!visited[j])&&(G.arcs[i][j]!=0))

                 {     

                        Minway(G,visited,G.vexs[j],Long+G.arcs[i][j],vb,path);  //递归调用自身

                 }

              visited[i]=false;                        //退出递归前清除访问记录

       }

}

void CountMinway(MGraph G)              //该函数调用递归部分实现递归

{

       charva,vb;

       stringpath;                      //存放路径

       cout<<"请输入要求的两个顶点字符:";

       cin>>va>>vb;

       cout<<endl;

    inti=Locate_vex(G,va);

       boolvisited[100];

       for(intj=0;j<G.vexnum;j++)

              visited[j]=false;             //初始化访问记录,全都未访问过

       visited[i]=true;                  //起点顶点设为访问过

       intLong=0;

      path+=va;

       for(j=0;j<G.vexnum;j++)

              if(G.arcs[i][j]!=0)

              {

                     Long=G.arcs[i][j];

                     Minway(G,visited,G.vexs[j],Long,vb,path);         //调用递归部分

              }

       cout<<endl;

}

 

void Minway()//输出最短路径

{

       intmin=10000;

       for(inti=0;i<allPath.size();i++)

              if(all[i]<min)

                     min=all[i];

       for(intj=0;j<allPath.size();j++)

              if(all[j]==min)

                     cout<<"最短路径: "<<allPath[j]<<"   长度:"<<all[j]<<endl;

       cout<<endl;

}

 

void main()

{      

       cout<<"a=校门口,b=主楼"<<endl;


        cout<<"c=钟海楼,d=校医院"<<endl;


       cout<<"e=科技楼,f=图书馆"<<endl;


       cout<<"g=体育馆,h=中心广场"<<endl;

       CreateUDG(G); 

       CountMinway(G);  

       Minway();  

}

四、运行结果:


 


由上述程序可知,

从校门口到科技楼的最短路径是校门口a → 体育馆g → 图书馆f →科技楼e。

该算法的时间复杂度为O(n2).


五、心得

        Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

       本次的实验代码与我当初所考虑的过程和设计有点差别,最主要是因为我的能力有限,最初的想法是直接将所有路径长短,距离等信息都输入进代码里面,然后在运行的结果里打入两点间的距离便可由程序算出两点间最短的距离;可是最后程序的运行结果就只能是两点与两点的距离相加,不能够实现单源最短路径。而我第二次选择的办法是运用递归算法和深度优先算法,在运行结果里面输入所有路径的信息,通过算法的计算,便可以得到单源最短路径,但是这样的算法相对比较繁琐。

不过未来我会努力学到更多知识,去解决我的疑惑。在这个学期里面非常感谢老师的教导,不只是知识的传播,而是不管是从教育方面还是做人做事方面我都深受启发。谢谢老师,也在此祝老师以后工作顺利,每一天都开开心心!

0 0
原创粉丝点击