新手出来,求解弗洛伊德算法问题
自己写了个有向图的弗洛伊德算法,遇到问题,请大家帮忙找一下,感谢!问题貌似出在输出路径及路径长度上,求解。
typedef char Vextype; //顶点类型
#define VEX_NUM 6
typedef struct
{
Vextype vexs[VEX_NUM]; //顶点向量
int arcs[VEX_NUM][VEX_NUM]; //邻接矩阵
int vexnum; //顶点数
int arcnum; //弧数
}Mgraph;
#define MAXINT 65536
void Floyd(int cost[][VEX_NUM],Mgraph Gn,int path[][VEX_NUM])
{
/*cost数组存储带权邻接矩阵,path[i][j]表示顶点vj的前驱顶点序号是i(顶点vi)*/
int i,j,k;
for(i=0;i<VEX_NUM;i++)
{
for(j=0;j<VEX_NUM;j++)
{
Gn.arcs[i][j]=cost[i][j];
if(i==j)
path[i][j]=-1;
else
{
if(cost[i][j]<MAXINT)
path[i][j]=i;
else
path[i][j]=0;
}
}
}
for(k=0;k<VEX_NUM;k++)
for(i=0;i<VEX_NUM;i++)
for(j=0;j<VEX_NUM;j++)
if(Gn.arcs[i][j]>(Gn.arcs[i][k]+Gn.arcs[k][j]))
{
Gn.arcs[i][j]=Gn.arcs[i][k]+Gn.arcs[k][j];
path[i][j]=path[k][j];
}
}
#include<stdio.h>
#include"Mgraph.h"
#include"Floyd.h"
int main()
{
int i,j,k;
Mgraph g;
int cost[VEX_NUM][VEX_NUM];
int path[VEX_NUM][VEX_NUM];
g.vexs[0]='A',g.vexs[1]='B',g.vexs[2]='C',g.vexs[3]='D',g.vexs[4]='E',g.vexs[5]='F';//定义图
for(i=0;i<VEX_NUM;i++)
for(j=0;j<VEX_NUM;j++)
{
g.arcs[i][j]=MAXINT;
cost[i][j]=MAXINT;
}
g.arcs[0][2]=10,g.arcs[0][4]=30,g.arcs[0][5]=100,g.arcs[1][2]=5,
g.arcs[2][3]=50,g.arcs[3][5]=10,g.arcs[4][3]=20,g.arcs[4][5]=60;
g.vexnum=g.arcnum=VEX_NUM;
for(i=0;i<VEX_NUM;i++)
{
printf("%c\t",g.vexs[i]);
for(j=0;j<VEX_NUM;j++)
{
printf("%d\t",g.arcs[i][j]);
}
printf("\n");
}
printf("\n");
Floyd(cost,g,path);
for(k=0;k<g.vexnum;k++)
{
for(i=0;i<g.vexnum;i++)
{
printf("Path %c to %c:\n",g.vexs[k],g.vexs[i]);
if(path[i][k]!=-1 )
{
for(j=0;path[i][j]!=-1;j++)
{
if (j!= 0)
printf("→");
printf("%c",g.vexs[path[i][j]]);
}
printf("\n");
}
}
printf("Length:%d\n",dist[i]);
printf("\n");
}
return 0;
}