C语言实现Floyd算法

 更新时间:2018年01月03日 14:00:37   作者:砺晗  
这篇文章主要为大家详细介绍了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 *mgraph); 
void Ppath(int path[][NUM], int i, int j); 
void Dispath(int A[][NUM], int path[][NUM], int n); 
 
int main(void) 
{ 
  MGraph *mgraph; 
 
  printf("\n*************************************************************\n"); 
  printf("该图的矩阵表示为:\n"); 
  mgraph=build_mgraph(); 
  printf("\n*************************************************************\n"); 
  printf("各顶点间最短路径为:\n"); 
  Floyd(mgraph); 
  printf("\n*************************************************************\n"); 
  
  return 0; 
} 
 
MGraph *build_mgraph() 
{ 
  int i,j; 
  int num_e=0; 
  MGraph *mgraph=(MGraph *)malloc(sizeof(MGraph)); 
  int matrix[NUM][NUM]={{0,5,INT_MAX,7}, 
    {INT_MAX,0,4,2}, 
    {3,3,0,2}, 
    {INT_MAX,INT_MAX,1,0}}; 
  for(i=0;i<NUM;i++) 
  { 
  for(j=0;j<NUM;j++) 
  { 
   mgraph->edges[i][j]=matrix[i][j]; 
   if(matrix[i][j]!=0 && matrix[i][j]!=INT_MAX) 
   num_e++; 
  } 
  } 
  mgraph->n=NUM; 
  mgraph->e=num_e; 
 
  printf("node=%d;edges=%d\n",mgraph->n,mgraph->e); 
  for(i=0;i<NUM;i++) 
  { 
  for(j=0;j<NUM;j++) 
  { 
   if(mgraph->edges[i][j]!=INT_MAX) 
   printf("%3d",mgraph->edges[i][j]); 
   else 
   printf("%3c",'&'); 
  } 
  printf("\n"); 
  } 
 
  return mgraph; 
} 
 
void Floyd(MGraph *mgraph) 
{ 
  int A[NUM][NUM],path[NUM][NUM]; 
  int i,j,k; 
 
  for(i=0;i<mgraph->n;i++) 
  { 
  for(j=0;j<mgraph->n;j++) 
  { 
   A[i][j]=mgraph->edges[i][j]; 
   path[i][j]=-1; 
  } 
  } 
 
  for(k=0;k<mgraph->n;k++) 
  { 
  for(i=0;i<mgraph->n;i++) 
  { 
   for(j=0;j<mgraph->n;j++) 
   { 
   if(A[i][k]!=INT_MAX && A[k][j]!=INT_MAX && A[i][j]>A[i][k]+A[k][j]) 
   { 
    A[i][j]=A[i][k]+A[k][j]; 
    path[i][j]=k; 
   } 
   } 
  } 
  } 
 
  Dispath(A,path,mgraph->n); 
} 
 
void Ppath(int path[][NUM], 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[][NUM], int path[][NUM], int n) 
{ 
  int i,j; 
  for(i=0;i<n;i++) 
  { 
  for(j=0;j<n;j++) 
  { 
   if(A[i][j]==INT_MAX) 
   printf("%d-%d have no path",i,j); 
   printf("%d-%d-%d: ",i,j,A[i][j]); 
   printf("%d,",i); 
   Ppath(path,i,j); 
   printf("%d\n",j); 
  } 
  } 
} 

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

相关文章

  • C语言清楚了解指针的使用

    C语言清楚了解指针的使用

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详尽的介绍
    2022-06-06
  • C++中链表操作实例分析

    C++中链表操作实例分析

    本文给大家分享了个人对于C++中链表操作的理解,并对具体实例进行了分析,是篇非常不错的学习链表操作的文章,希望大家能够喜欢
    2017-07-07
  • C语言 指针的初始化赋值案例详解

    C语言 指针的初始化赋值案例详解

    这篇文章主要介绍了C语言 指针的初始化赋值案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 深入解析C++编程中的运算符重载

    深入解析C++编程中的运算符重载

    这篇文章主要介绍了C++编程中的运算符重载,运算符重载是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-04-04
  • C语言基于单链表实现通讯录功能

    C语言基于单链表实现通讯录功能

    这篇文章主要为大家详细介绍了C语言基于单链表实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Qt数据库应用之实现通用数据生成器

    Qt数据库应用之实现通用数据生成器

    有两种应用场景需要用到数据生成器,一种是需要测试数据库性能,一种是随机模拟生成一堆数据,用来测试程序的性能。本文将利用Qt实现通用数据生成器,需要的可以参考一下
    2022-02-02
  • 讲解C++编程中Address-of运算符&的作用及用法

    讲解C++编程中Address-of运算符&的作用及用法

    这篇文章主要介绍了C++编程中Address-of运算符&的作用及用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • C语言详细讲解循环语句的妙用

    C语言详细讲解循环语句的妙用

    C语言循环控制语句是一个基于C语言的编程语句,该语句主要有while循环语句、do-while循环语句和for循环语句来实现循环结构,在循环过程中还有关键字break、continue、do、break控制中断继续与结束等操作
    2022-04-04
  • 详解C语言的结构体中成员变量偏移问题

    详解C语言的结构体中成员变量偏移问题

    这篇文章主要介绍了C语言的结构体中成员变量偏移问题,以讲解如何编写宏来对成员变量进行修改为主,需要的朋友可以参考下
    2016-04-04
  • C语言程序如何求学生总成绩和平均成绩

    C语言程序如何求学生总成绩和平均成绩

    这篇文章主要介绍了C语言程序如何求学生总成绩和平均成绩,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论