首页 新闻 会员 周边

图的任意二个顶点之间的最小路径

0
[已关闭问题]

以下代码中的递归调用一段(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");
}

 zhaoyazhe888888@163.com

 

zhaoyazhe888888的主页 zhaoyazhe888888 | 初学一级 | 园豆:200
提问于:2010-03-04 18:22
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册