题目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;
}