C语言实现图的最短路径Floyd算法

Floyd算法直接使用二维数组求出所有顶点到所有顶点的最短路径。

D代表顶点到顶点的最短路径权值和的矩阵。
P代表对应顶点的最小路径的前驱矩阵。

以下程序在DEV C++中调试运行通过。

#include <stdio.h> 

#define INFINITY 65535 

typedef int VertexType; //顶点是字符型
typedef int EdgeType; //边是整型
typedef struct //图的邻接矩阵存储结构
{ 

 VertexType vexs[9]; //顶点向量 

 EdgeType edges[9][9];  //邻接矩阵 

 int vexnum,arcnum; //图中当前的顶点数和边数 

}MGraph; 

/* 邻接矩阵的建立*/ 

void CreateGraph(MGraph *G)
{
 int i,j,k,weight;
 int ch1,ch2; 

 printf("请输入顶点数和边数(输入格式为:顶点数,边数):"); 

 scanf("%d,%d",&(G->vexnum),&(G->arcnum)); 

 printf("请输入顶点名称(输入格式为:a,b,c...):"); 

 for(i=0;i<G->vexnum;i++)
 {
  getchar();
  scanf("%d",&(G->vexs[i]));
 } 

 for(i=0;i<G->vexnum;i++)
  for(j=0;j<G->vexnum;j++)
   if(i==j)
    G->edges[i][j]=0;
   else
    G->edges[i][j]=INFINITY; 

  printf("请输入每条边对应的两个顶点名称(输入格式为:a,b):\n"); 

  for(k=0;k<G->arcnum;k++)
  {
   // getchar();
   printf("请输入第%d条边的两个顶点名称:",k+1);
   scanf("%d,%d",&ch1,&ch2);
   for(i=0;ch1!=G->vexs[i];i++);
   for(j=0;ch2!=G->vexs[j];j++);
   getchar();
   printf("请输入第%d条边的权值:",k+1);
   scanf("%d",&weight);
   G->edges[i][j]=weight;
   G->edges[j][i]=weight;
  } 

} 

void ShortestPath_Floyd(MGraph G,int P[9][9],int D[9][9])
{
 int v,w,k;
 for(v=0;v<G.vexnum;v++)//初始化D和P
 {
  for(w=0;w<G.vexnum;w++)
  {
   D[v][w]=G.edges[v][w];
   P[v][w]=w;
  }
 } 

 for(k=0;k<G.vexnum;k++)
 {
  for(v=0;v<G.vexnum;v++)
  {
   for(w=0;w<G.vexnum;w++)
   {
    if(D[v][w]>(D[v][k]+D[k][w]))
    {//如果经过下标为k顶点路径比原两点间路径更短,将当前两点间权值设为更小的一个
    D[v][w]=D[v][k]+D[k][w];
    P[v][w]=P[v][k];
    } 

   }
  }
 }
}
void main()
{
 MGraph G;
 CreateGraph(&G);
 int i,j;
 printf("edgesnum:%d\n",G.arcnum);
 printf("vexesnum:%d\n",G.vexnum);
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
   printf("%d ",G.edges[i][j]);
  printf("\n");
 }
 int v,w,k;
 int P[9][9];
 int D[9][9];
 printf("%d\n",P);
 printf("%d\n",D);
 ShortestPath_Floyd(G,P,D);
 for(v=0;v<G.vexnum;v++)//显示路径
 {
  for(w=v+1;w<G.vexnum;w++)
  {
   printf("v%d-v%d weight:%d ",v,w,D[v][w]);
   k=P[v][w];
   printf("path:%d",v);
   while(k!=w)
   {
    printf("->%d",k);
    k=P[k][w];
   }
   printf("->%d\n",w);
  }
 }
} 

运行结果如图所示。

整个算法的时间复杂度是O(n^3)。

在编写过程中遇到了以下错误:
在62行
[Error]subscripted value is neither array nor pointer nor vector

意思是
下标的值不是数组或指针或向量
当时我这一行是这样写的
void ShortestPath_Floyd(MGraph G,int** P,int** D)
因为在上一篇文章Dijkstra算法中一维数组作为函数参数是用的int*,没有问题
所以在这里二维数组我就想当然地用了int**
但是如果参数传入int**类型,在函数里就不能使用P[v][w]访问二维数组的值

编译器不能正确为它寻址,需要模仿编译器的行为把P[v][w]这样的式子手工转变为:

*((int*)P + n*v + w);

所以在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明
故改为void ShortestPath_Floyd(MGraph G,int P[9][9],int D[9][9])就可以编译通过。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现Floyd算法

    本文实例为大家分享了C语言实现Floyd算法的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <limits.h> #define NUM 4 typedef struct MGraph /* 邻接表存储结构 */ { int edges[NUM][NUM]; int n,e; } MGraph; MGraph *build_mgraph(); void Floyd(MGraph *mg

  • C++实现多源最短路径之Floyd算法示例

    本文实例讲述了C++实现多源最短路径之Floyd算法.分享给大家供大家参考,具体如下: #include<cstdio> #include<cstring> #include<iostream> #define MAX 999 using namespace std; int n,m; int e[MAX][MAX]; void Init() { for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) { if(i==

  • C语言实现图的最短路径Floyd算法

    Floyd算法直接使用二维数组求出所有顶点到所有顶点的最短路径. D代表顶点到顶点的最短路径权值和的矩阵. P代表对应顶点的最小路径的前驱矩阵. 以下程序在DEV C++中调试运行通过. #include <stdio.h> #define INFINITY 65535 typedef int VertexType; //顶点是字符型 typedef int EdgeType; //边是整型 typedef struct //图的邻接矩阵存储结构 { VertexType vexs[9]; /

  • Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个点到其他各顶点的路径--单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, 3:{3:0, 5:5}, 4:{3:4, 4:0, 5:13, 6:15}, 5:{5:0, 6:4}, 6:{6:0}} # 每次找到离源点最近的一个顶

  • Java Floyd算法求有权图(非负权)的最短路径并打印

    状态转移方程:d(i,j) = min(d(i,j),d(i,k)+d(k,j)),其中i<k<j 思路对于每一个k(i<k<j),全部遍历下来之后,肯定会发生一次有效的比较 public class FloydTest { private static int[][] matrix; private static int[][] path; public static void main(String[] args) { initMatrixAndPath( new int[][

  • Python基于Floyd算法求解最短路径距离问题实例详解

    本文实例讲述了Python基于Floyd算法求解最短路径距离问题.分享给大家供大家参考,具体如下: Floyd算法和Dijkstra算法,相信大家都不陌生,在最短路径距离的求解中应该算得上是最为基础和经典的两个算法了,今天就用一点时间来重新实现一下,因为本科的时候学习数据结构才开始接触的这个算法,当时唯一会用的就是C语言了,现在的话,C语言几乎已经离我远去了,个人感觉入手机器学习以来python更得我心,因为太通俗易懂了,带给你的体验自然也是非常不错的. 当然网上 有很多的算法讲解教程,我不会在

  • Python使用Dijkstra算法实现求解图中最短路径距离问题详解

    本文实例讲述了Python使用Dijkstra算法实现求解图中最短路径距离问题.分享给大家供大家参考,具体如下: 这里继续前面一篇<Python基于Floyd算法求解最短路径距离问题>的内容,这里要做的是Dijkstra算法,与Floyd算法类似,二者的用途均为求解最短路径距离,在图中有着广泛的应用,二者的原理都是老生常谈了,毕竟本科学习数据结构的同学是不可能不学习这两个算法的,所以在这里我也不再累赘,只简单概述一下这个算法的核心思想: Dijkstra算法的输入有两个参数,一个是原始的数据矩

  • C++求所有顶点之间的最短路径(用Floyd算法)

    本文实例为大家分享了C++所有顶点之间最短路径的具体代码,供大家参考,具体内容如下 一.思路: 不能出现负权值的边 用Floyd算法,总的执行时间为O(n的3次方) k从顶点0一直到顶点n-1, 如果,有顶点i到顶点j之间绕过k,使得两顶点间的路径更短,即dist[i][k] + dist[k][j] < dist[i][j],则修改:dist[i][j] 如:(1)当k=0时, 顶点2绕过顶点0到达顶点1,使得路径为:3+1 < dist[2][1],所以,要修改dist[2][1]=4,同

  • Java利用Dijkstra和Floyd分别求取图的最短路径

    目录 1 最短路径的概述 2 杰斯特拉(Dijkstra)算法 2.1 原理 2.2 案例分析 3 弗洛伊德(Floyd)算法 3.1 原理 3.2 案例分析 4 邻接矩阵加权图实现 5 邻接表加权图实现 本文详细介绍了图的最短路径的概念,然后介绍了求最短路径的两种算法:Dijkstra算法和Floyd算法的原理,最后提供了基于邻接矩阵和邻接表的图对两种算法的Java实现. 阅读本文需要一定的图的基础,如果对于图不是太明白的可以看看这篇文章:Java数据结构之图的原理与实现. 1 最短路径的概述

  • Java语言基于无向有权图实现克鲁斯卡尔算法代码示例

    所谓有权图,就是图中的每一条边上都会有相应的一个或一组值.通常情况下,这个值只是一个数字 如:在交通运输网中,边上的权值可能表示的是路程,也可能表示的是运输费用(显然二者都是数字).不过,边上的权值也有可能是其它东西,比如说是一个字符串,甚至是一个更加复杂的数据包,里面集合了更多的数据 克鲁斯卡尔算法的核心思想是:在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到最后得到一颗最小生成树. 克鲁斯卡尔算法的执行步骤: 第一步:在带权连通图中,将边的权值

随机推荐