两点间A C有 B 则路径是从 A 到B 再从 B到C
弗洛伊德算法每次加入一个顶点观察距离是否发生变化(减小)
void printfloyd(graph g,int path2[][6],char v,char v1)
{
int t=locate(g,v);//获取起始点下标;
int t1=locate(g,v1);//终点下标;
if(path2[t][t1]==-1) 等于-1代表两点之间没有过渡点 则两点间最初距离为最短路径
{
cout<<v<<" "<<v1<<" ";
}
else
{
cout<<v<<" "<<" ";
printfloyd (g,path2,g.vexs[path2[t][t1]],v1);
}
}
void floyd(graph g )
{
const int p=g.vexnum;
int path1[6][6];
int i,j,k,D[p][p];
for(i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
D[i][j]=g.arcs[i][j];
path1[i][j]=-1;
}
} //用二维D数组存放
for(i=0;i<g.vexnum;i++)
{
for(j=0;j<g.vexnum;j++)
{
cout<<setw(20)<<D[i][j];
}
cout<<endl;
}
for(k=0;k<g.vexnum;k++)//有g.vexnum个点从0开始下标依次加入到矩阵中观察每个点之间距离变化
{
for(i=0;i<g.vexnum;i++)
{
for(j=0;j<g.vexnum;j++)
{
if(D[i][k]+D[k][j]<D[i][j]) 以k为过渡点若距离变小则修改距离
{
D[i][j]=D[i][k]+D[k][j];//这一步循环结束后则是每个点之间的最短路径
path1[i][j]=k;//过渡点下标为k 这一步为打印路径准备
}
}
}
}
cout<<endl;
for(i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
cout<<setw(20)<<path1[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
for(i=0;i<g.vexnum;i++)
{
for(j=0;j<g.vexnum;j++)
{
cout<<setw(20)<<D[i][j];
}
cout<<endl;
}
cout<<endl<<"请输入弗洛伊德算法起始点和终点打印路径"<<endl;
char v1,v2;
cin>>v1>>v2;
cout<<v1<<"到"<<v2<<"最短路径为:"<<endl;
printfloyd(g,path1,v1,v2);
}