以下代码中的递归调用一段(ppath(int path[][6],int i,int j))不明白,想请您给讲解一下.
#include <stdio.h>
#define INF 32767 //用32767表示∞
int path[6][6];
typedef struct //图的定义
{ int edges[MAXV][MAXV]; //邻接矩阵
int vexnum,arcnum; //顶点数,弧数
} MGraph; //图的邻接矩阵类型
void DispMat(MGraph g)
//输出邻接矩阵g
{
int i,j;
for (i=0;i<g.vexnum;i++)
{
for (j=0;j<g.vexnum;j++)
if (g.edges[i][j]==INF)
printf("%3s","∞");
else
printf("%3d",g.edges[i][j]);
printf("\n");
}
}
void DispPath(MGraph g,int path[][6]);
void ppath(int path[][6],int i,int j)
{
int k;
k=path[i][j];
if (k==-1)
return;
ppath(path,i,k);
printf("%d,",k);
ppath(path,k,j);
}
void DisPath(int A[][6],int path[][6],MGraph g)
{
int i,j,n=g.vexnum ;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (A[i][j]==INF)
{
if (i!=j)
printf("从%d到%d没有路径\n",i,j);
}
else
{
if(i!=j)
{
printf("从%d到%d路径为:",i,j);
printf("%d,",i);
if(path[i][j]!=-1)
ppath(path,i,j);
printf("%d",j);
printf("\t路径长度为:%d\n",A[i][j]);
}
}
}
void Floyd(MGraph g) //弗洛伊德算法从每对顶点之间的最短路径
{
int A[6][6];
int i,j,k,n=g.vexnum,pre;
for (i=0;i<n;i++) //给A数组置初值
for (j=0;j<n;j++)
{
A[i][j]=g.edges[i][j];
path[i][j]=-1;
}
for (k=0;k<n;k++) //计算Ak
{
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{
if(i==j||i==k||j==k)
continue;
if (A[i][j]>(A[i][k]+A[k][j]))
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
printf("\n输出最短路径:\n");
DisPath(A,path,g);
}
void main()
{
int i,j,u=0;
MGraph g;
int A[6][6]={
{0,50,10,INF,INF,INF},
{INF,0,15,50,10,INF},
{20,INF,0,15,INF,INF},
{INF,20,INF,0,35,INF},
{INF,INF,INF,30,0,INF},
{INF,INF,INF,3,INF,0}};
g.vexnum=6;g.arcnum=10;
for (i=0;i<g.vexnum;i++)
for (j=0;j<g.vexnum;j++)
g.edges[i][j]=A[i][j];
printf("\n");
printf("有向图G的邻接矩阵:\n");
DispMat(g);
Floyd(g);
printf("\n");
}