标签:
#include<iostream>
using namespace std;
const int MaxSize=20;
template<class T>
class Mgraph
{
public:
Mgraph(T a[],int n,int e);
private:
T vertex[MaxSize];
int arc[MaxSize][MaxSize];
int vertexNum,arcNum;
friend void Floyd(Mgraph<T>G,int v);
};
template<class T>
Mgraph<T>::Mgraph(T a[],int n,int e)
{
vertexNum=n;arcNum=e;int i,j,k;
cout<<"顶点0:校门口\t顶点1:水生博物馆\t顶点2:主楼"<<endl
<<"顶点3:图书馆\t顶点4:体育馆\t 顶点5:东区体育场"<<endl
<<":顶点6:西湖\t顶点7:小后山\t 顶点8:校医院"<<endl;
for(i=0;i<vertexNum;i++)
vertex[i]=a[i];//出事话顶点
for(i=0;i<vertexNum;i++)
for(int j=0;j<arcNum;j++)
arc[i][j]=0;//初始化顶点间的距离
for(k=0;k<arcNum;k++)
{
cout<<"输入顶点序号:";
cin>>i>>j;
for(;;)
{
if(i>vertexNum||j>vertexNum||i==j){cout<<"输入无效,请重输:";cin>>i>>j;}
else break;
}
cout<<"输入点"<<i<<"到"<<j<<"间需要的时间(min):";
cin>>arc[i][j];
}
for(i=0;i<vertexNum;i++)
for(j=0;j<arcNum;j++)
{
if(i==j)
arc[i][j]=0;
if(i!=j&&arc[i][j]==0)arc[i][j]=99;//以99代替无穷大
else
arc[j][i]=arc[i][j];
}
}
template<class T>
void Floyd(Mgraph<T>G,int v)//定义友元函数访问私有成员
{
int dist[10][20],path[10][20];int i,j,k;
for(i=0;i<G.vertexNum;i++)
for(j=0;j<G.vertexNum;j++)
{
dist[i][j]=G.arc[i][j];//初始化dist[i][j]
if(dist[i][j]!=99)path[i][j]=10*G.vertex[i]+G.vertex[j];//初始化路径
}
for(k=0;k<G.vertexNum;k++)
for(i=0;i<G.vertexNum;i++)
for(j=0;j<G.vertexNum;j++)
if(dist[i][k]+dist[k][j]<dist[i][j])
{
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=j*100+10*k+i;//以数字表示最短路径所经顶点
}
//求出最短路径
cout<<"顶点0:校门口\t顶点1:水生博物馆\t顶点2:主楼"<<endl
<<"顶点3:图书馆\t顶点4:体育馆\t 顶点5:东区体育场"<<endl
<<":顶点6:西湖\t顶点7:小后山\t 顶点8:校医院"<<endl;
for(;;)
{
cout<<"输入需查询的顶点,输入88则退出:";cin>>k;
for(i=0;i<G.vertexNum;i++)//查询指定顶点相关信息
if(k>G.vertexNum)
{
if(k!=88)
{ cout<<"输入无效,请重输。"<<endl;break;}//输入顶点号以外数字则重输
else exit(0);//输入88则直接退出程序
}
else if(i!=k)
{
cout<<k<<"与"<<i<<"间的最短距离为"<<dist[k][i]<<endl;
if(path[k][i]>100)
cout<<"最短路径为:"<<k<<"→"<<(path[k][i]%100)/10<<"→"<<i<<endl;
else
cout<<"最短路径为:"<<k<<"→"<<i<<endl;
}//输出最短路径
}
}
int main()
{
int a[9]={0,1,2,3,4,5,6,7,8};//初始化顶点数,可按自己喜好添加减少
Mgraph<int>Mgraph(a,8,15);
Floyd(Mgraph,0);//调用友元函数
return 0;
}
标签:
原文地址:http://blog.csdn.net/z28126308/article/details/42630337