您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计

2015-01-14 00:02 176 查看

 
 
 
 
 
《数据结构课程设计》
 
 
 
 
 

 
课程题目
最佳路径问题
课程编号
j1620102
学生姓名
杨小华
所在专业
信息管理和信息系统
所在班级
            信管1134班
任课老师
易学明
实习时间
   第十七周
设计成绩
 
老师评语
 
 
 
 
 
 
题目0.GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如0教学楼、1饭堂、2宿舍楼、3图书馆、4体育馆、5运动场、6商业街、7医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。 
 
本程序采用Floyd算法,其基本思想是先定义两个点Vi到Vj之间的弧是最短路径,然后进行n次试探。首先比较Vi,Vj和Vi,V0的路径长度,取长度较短的作为中间顶点的编号不大于1的最短路径。一次类推,经过n次比较之后,最后求得Vi到Vj之间的最短路径。
题目0中一共有7个地点,它们之间的分布和距离如下图:
1:饭堂、2:医院  3:图书馆、4:宿舍楼、5:体育馆、6:商业街  7:运动场
 
 

运行的环境:VC6.0,这个软件是比较适合C++初学者来使用,有着较为健全的功能。

使用的算法:Floyd算法

#include <iostream>    

#include <string>    

#include<iomanip>      //引入输入输出格式头文件  

using namespace std;    

const int Maxsize = 10;    

  

class MGraph    //定义一个类:地图

{    

public:    

    MGraph(string a,int n,int e);    

    void Floyd();    

    void print();    

private:    

    string vertex[Maxsize];    

    int arc[Maxsize][Maxsize];    

    int vertexNum,arcNum;    

    int dist[Maxsize][Maxsize];    

   string path[Maxsize][Maxsize];    

};    

  

MGraph:: MGraph(string a,int n,int e)    

{   int i,j,k,info;    

    vertexNum = n;    

    arcNum = e;    

    for(i=0;i<vertexNum;i++)    

        vertex[i]=a[i];    

  

    for(i=0;i<vertexNum;i++)        //初始化边,请将不到达边初始值为最大值,这里设置为10000  

        for(j=0;j<vertexNum;j++)    

            arc[i][j]=10000;    

  

    for(k=0;k<arcNum;k++)          //输入图的边的顶点信息,将图顶点进行编号,从0开始  

    {   cout<<"请输入边依附的两个顶点的编号"<<endl;    

        cin>>i>>j;    

        while(i>=vertexNum && j>=vertexNum)    

        {   cout<<"请重新输入"<<endl;    

            cin>>i>>j;    

        }    

        cout<<"请输入边的权值"<<endl;  //输入图的边的权值  

        cin>>info;    

 

        while(info < 0)    

        {   cout<<"请重新输入"<<endl;    

            cin>>info;    

        }    

        arc[i][j]=info;    

    }    

  }    

void MGraph::Floyd()   //定义了Floyd算法

{   int i,j,k;    

    for(i=0;i<vertexNum;i++)           //初始化dist和path   

        for(j=0;j<vertexNum;j++)    

        {    dist[i][j] = arc[i][j];   

             if(dist[i][j] != 10000)   

                 path[i][j]=vertex[i]+vertex[j];    

             else path[i][j] =" ";    

        }    

    for(k=0;k<vertexNum;k++)                      //判定顶点i j之间是否经过k  

        for(i=0;i<vertexNum;i++)    

            for(j=0;j<vertexNum;j++)    

                if(dist[i][k]+dist[k][j]<dist[i][j])  

                {   dist[i][j]=dist[i][k]+dist[k][j];    

                    path[i][j]=path[i][k]+"-"+path[k][j];    

                }   

}    

void MGraph::print()    //结点m到n的最短路径    

{    int a,b,i;    

    cout<<"图的所有路径如下:"<<endl;    

for(i=0;i<vertexNum;i++)  //输出图的所有路径信息  

 

    {   for(int j=0;j<vertexNum;j++)    

           cout<<setw(10)<<setiosflags(ios::left)<<path[i][j]<<" ";    //10个字符位置,且左对齐  

        cout<<endl;    

    }    

    cout<<"图的所有路径长如下:"<<endl;    

    for(i=0;i<vertexNum;i++)  //输出图的各边长信息  

    {  for(int j=0;j<vertexNum;j++)    

        cout<<setw(3)<<setiosflags(ios::left)<<dist[i][j]<<" ";   //3个字符位置,且左对齐  

       cout<<endl;    

    }    

    cout<<"您想了解哪两个点的最短路径?请输入这两个点"<<endl;    

string ch1,ch2;    

 

    cin>>ch1>>ch2;        //输入要判定是的顶点,请输入顶点字符。         

    for(i=0;i<vertexNum;i++)    

        if(vertex[i] == ch1) a=i;    

    for(i=0;i<vertexNum;i++)    

        if(vertex[i] == ch2) b=i;    

    cout<<ch1<<"到"<<ch2<<"的最短路径为:"<<path[a][b]<<"长度为"<<dist[a][b]<<endl;    

    system("pause");  

}    

       

int main()    

{  int n,e;  

   string ch;    

   cout<<"请输入顶点数和边数,空格格开:"<<endl;    
 

   cin>>n>>e;  

   cout<<"请依次输入各个顶点字符串:"<<endl;    

 

   cin>>ch;  

    MGraph m(ch,n,e);    

    m.Floyd();    

    m.print();    
    return 0;    


这个程序相对比较简单,采用了Floyd算法,可以比较简便的算出两个点之间的长度。通过这次课程设计,再次巩固了C++的基础知识,此外也让我对了最短路径的算法有了更加深刻的认识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构