课程设计题目0

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

#include<iostream>
#include <string>    
#include<iomanip>
using namespace std;
const int maxsize=100;
class MGraph
{
public:
MGraph(string a,int n,int e); //构造函数,建立具有n个顶点e条边的图
~MGraph(){};                       //析构函数
        void floyd();
void jin();
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;    
    vertexNum = n;    
    arcNum = e;    
    for(i=0;i<vertexNum;i++)    
        vertex[i]=a[i];    
  
    for(i=0;i<vertexNum;i++)        //初始化边
        for(j=0;j<vertexNum;j++)    
            arc[i][j]=1000; 
arc[0][1]=200;
arc[1][2]=100;
arc[1][3]=100;
arc[3][4]=50;
arc[4][5]=50;
arc[0][5]=250;
arc[5][6]=300;
arc[4][6]=200;
arc[5][7]=50;
arc[0][7]=300;
arc[7][8]=250;
arc[5][8]=500;
arc[0][4]=250;
}
void MGraph::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::jin()    //结点m到n的最短路径    
{    int a,b,i;    
    cout<<"图的所有路径如下:"<<endl;    
    for(i=0;i<vertexNum;i++)  //输出图的所有路径信息  
    {   for(int j=0;j<vertexNum;j++)    
           cout<<setw(10)<<path[i][j]<<" ";      
        cout<<endl;    
    }    
    cout<<"图的所有路径长如下:"<<endl;    
    for(i=0;i<vertexNum;i++)  //输出图的各边长信息  
    {  for(int j=0;j<vertexNum;j++)    
        cout<<setw(5)<<dist[i][j]<<" ";    
       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=9;
int e=13;
string ch;
cout<<"下述为字母代表的地点:z.校门口  b.商中  c.东区体育场  d.体育馆  f.图书馆  g.主楼  h.科技楼 p.钟海楼 q.校医院"<<endl;  
cout<<"请输入依次输入各个顶点字符串:"<<endl;    
    cin>>ch;
 MGraph m(ch,n,e);    
    m.floyd();    
    m.jin();    
    return 0;   

}   




 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值