图的Flord算法(图中点到点的最短距离

来源:互联网 发布:数据备份与还原 编辑:程序博客网 时间:2024/04/19 03:32
 

include "stdafx.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAXVEX 20
#define INFINY 65536
struct graph{
 int numberV,numberE;
 int V[MAXVEX];    //图的顶点
 int E[MAXVEX][MAXVEX];  //图的边的权重
};
typedef int shortPath[MAXVEX][MAXVEX];
typedef int shortPosition[MAXVEX][MAXVEX];


//图的创建
void createGraph(graph *G)
{
 G->numberV=5;
 G->numberE=7;
 for(int i=0;i<G->numberV;i++)
   G->V[i]=i;
 for(int i=0;i<G->numberV;i++)    //对图进行初始化
  for(int j=0;j<G->numberV;j++)
  {
   if(i==j)
    G->E[i][j]=0;
   else
      G->E[i][j]=INFINY;
  }
  G->E[0][1]=10;
  G->E[0][2]=20;
  G->E[0][3]=3;
  G->E[1][2]=5;
  G->E[1][3]=2;
  G->E[2][4]=11;
  G->E[3][4]=15;
 for(int i=0;i<G->numberV;i++)
  for(int j=i;j<G->numberV;j++)
   G->E[j][i]=G->E[i][j]; 
}

//图的Floyd的最短路径(即点到点的最后路径)
void  shortFloyd(graph *G,shortPath *p,shortPosition *q)
{
 for(int i=0;i<G->numberV;i++)
  for(int j=0;j<G->numberV;j++)
  {
   (*q)[i][j]=j;
   (*p)[i][j]=G->E[i][j];
  }
  for(int k=0;k<G->numberV;k++)
   for(int i=0;i<G->numberV;i++)
    for(int j=0;j<G->numberV;j++)
    {
     if((*p)[i][j]>(*p)[i][k]+(*p)[k][j])
     {
      (*p)[i][j]=(*p)[i][k]+(*p)[k][j];
      (*q)[i][j]=(*q)[i][k];
     }
    }
 
}

int main(int argc,char**argv)
{
 struct graph m;
    shortPath p;
 shortPosition q;
 createGraph(&m);
 printf("顶点数:%d\n",m.numberV);
 printf("边数:%d\n",m.numberE);
 shortFloyd(&m,&p,&q);
 for(int i=0;i<m.numberV;i++)
  for(int j=0;j<m.numberV;j++)
  {
   if(p[i][j]!=INFINY&&i!=j&i<j)
               printf("顶点%d到顶点%d的距离是%d\n",i,j,p[i][j]);
  }
 return 0;
}