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

该博客介绍了如何通过Floyd算法计算图中任意两点间的最短路径。首先,定义了一个图的结构,包括顶点和边的权重。接着,通过createGraph函数初始化图的数据。然后,实现shortFloyd函数来更新最短路径矩阵p和位置矩阵q。最后,main函数中调用这些函数并输出最短路径结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值