教材上Floyd算法最后打印出来的结果有点小问题 一开始着重于路径 path数组进行调整,先是调用n次Dijkstra算法 得到路径path 然后尝试调整Floyd算法中path数组。 浏览了网上其他的Floyd算法后,觉得问题不是在path数组上,而是在路径打印问题上,然后对路径打印做了些调整。 因本人能力有限,调整后的程序 也可能会有些许问题,恳请读者批评指正。
测试图 与数据 详见课本
#include <stdio.h>
#include <stdlib.h>
#define MaxVerNum 10
#define Infinity 1000
typedef struct
{
char vertex[MaxVerNum];
int edges[MaxVerNum][MaxVerNum];
int vertex_num;
int edge_num;
}MGraph;
void Create_MG(MGraph* G)
{
int i,j,k,weight;
printf("Please input the vertex_num and edge_num\n");
scanf("%d %d",&(G->vertex_num),&(G->edge_num));
for (i=0;i<G->vertex_num;i++)
{
printf("Please input the vertex\n");
scanf(" %c",&(G->vertex[i]));
}
for (i=0;i<G->vertex_num;i++)
{
for (j=0;j<G->vertex_num;j++)
{
if (i==j)
{
G->edges[i][j]=0;
} else
{
G->edges[i][j]=Infinity;
}
}
}
for (k=0;k<G->edge_num;k++)
{
// printf("Please input the edges\n");
scanf("%d %d %d",&i,&j,&weight);
G->edges[i][j]=G->edges[j][i]=weight;
}
}
void Floyd(MGraph* G,int path[][MaxVerNum],int cost[][MaxVerNum])
{
int i,j,k,temp;
int tmp;
/**初始化*/
for (i=0;i<G->vertex_num;i++)
{
for (j=0;j<G->vertex_num;j++)
{
cost[i][j]=G->edges[i][j];
path[i][j]=j;
}
}
/**Floyd核心算法*/
for (k=0;k<G->vertex_num;k++)
{
for (i=0;i<G->vertex_num;i++)
{
for (j=0;j<G->vertex_num;j++)
{
tmp=(cost[i][k]==Infinity||cost[k][j]==Infinity)?Infinity:(cost[i][k]+cost[k][j]);
if (tmp<cost[i][j])
{
cost[i][j]=tmp;
path[i][j]=k;
}
}
}
}
/**打印路径*/
printf("\nFloyd\n");
for (i=0;i<G->vertex_num;i++)
{
for (j=0;j<G->vertex_num;j++)
{
if (i==j)
{
continue;
}
/**书上 从v0到v3路径有问题 修改后从v0到v3的路径正确 却发现从v3到v0的路径仍有问题 因此在打印v3到v0的路径时 采用栈 将v0到v3的路径存入栈中 再将栈中的路径打印出来*/
if (i<j)
{
temp=i;
printf("v%d 到v%d的最短路径长度为:%d",i,j,cost[i][j]);
printf("路径为: v%d",i);
while(path[temp][j]!=j)
{
k=path[temp][j];
temp=k;
printf("->v%d",k);
}
printf("->v%d\n",j);
} else
{
temp=j;
int Stack[MaxVerNum]={0},rear=-1;
while(path[temp][i]!=i)
{
k=path[temp][i];
temp=k;
Stack[++rear]=k;
}
printf("v%d 到v%d的最短路径长度为: %d",i,j,cost[i][j]);
printf("路径为: v%d",i);
while(rear>=0)
{
printf("->v%d",Stack[rear--]);
}
printf("->v%d\n",j);
}
}
printf("\n");
}
}
int main(void)
{
int cost[MaxVerNum][MaxVerNum],path[MaxVerNum][MaxVerNum];
MGraph* G=(MGraph*)malloc(sizeof(MGraph));
Create_MG(G);
Floyd(G,path,cost);
return 0;
}
来源:CSDN
作者:河大程某
链接:https://blog.csdn.net/Cheng_XZ/article/details/103462076