弗洛伊德算法也是一种寻找最短路径的算法,算法核心思路如下:\n\n路径矩阵\n通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 [3] \n\n从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。\n\n采用松弛技术(松弛操作),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);\n\n\n状态转移方程\n其状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};\n\nmap[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。\n\n当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。
#include <cstdio>
#include <algorithm>
#define Max 100
#define Maxint 100000
typedef struct
{
int vex,arc;
int weight[Max][Max];
}Graph;
int Dist[Max][Max];
int Path[Max][Max];
void CreatGraph(Graph &G)
{
int vex,arc;
printf("顶点数:");
scanf("%d",&vex);
G.vex=vex;
printf("边数:");
scanf("%d",&arc);
G.arc=arc;
int i,j,weight;
for(i=0;i<vex;i++)
{
for(j=0;j<vex;j++)
{
if(i==j) G.weight[i][j]=0;
else G.weight[i][j]=Maxint;
}
}
int e1,e2;
for(i=0;i<arc;i++)
{
printf("第%d条边 顶点->权值->顶点:",i+1);
scanf("%d%d%d",&e1,&weight,&e2);
G.weight[e1][e2]=weight;
}
}
/*void Input(Graph G)
{
int i,j;
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
{
printf("%8d",G.weight[i][j]);
}
printf("\n");
}
}*/
void Floyd(Graph &G)
{
int i,j,k;
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
{
Dist[i][j]=G.weight[i][j];
if(i!=j&&Dist[i][j]<Maxint) Path[i][j]=i;
else Path[i][j]=-1;
}
}
for(k=0;k<G.vex;k++)
{
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
{
if(Dist[i][k]+Dist[k][j]<Dist[i][j])
{
Dist[i][j]=Dist[i][k]+Dist[k][j];
Path[i][j]=Path[k][j];
}
}
}
}
}
int main()
{
Graph G;
CreatGraph(G);
system("cls");
//Input(G);
int i,j;
Floyd(G);
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
{
if(Dist[i][j]<Maxint&&i!=j)
printf("Dist[%d][%d]=%3d ",i,j,Dist[i][j]);
}
printf("\n");
}
int vex1,vex2;
while(1)
{
printf("顶点一:");
scanf("%d",&vex1);
printf("顶点二:");
scanf("%d",&vex2);
if(vex1==-1&&vex2==-1) break;
if(Dist[vex1][vex2]==Maxint) printf("该两点无最短路径!\n");
else
{
if(vex1==vex2) printf("ERROR!\n");
else
{
int t=vex2;
printf("经过顶点:");
printf("%-3d",t);
while(Path[vex1][t]!=-1)
{
t=Path[vex1][t];
printf("%-3d",t);
}
printf("\n");
}
}
}
return 0;
}