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语言的随机数生成及其相关题目,作者还列举了阿里巴巴的一道相关的面试题,需要的朋友可以参考下
    2015-08-08
  • C++中多态的定义及实现详解

    C++中多态的定义及实现详解

    这篇文章主要给大家介绍了关于C++中多态的定义及实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C语言快速掌握位段使用

    C语言快速掌握位段使用

    位段位段的声明和结构是类似的,但是也会有所不同,此篇文章将带你了解位段是什么已以及位段的使用和位段的特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • C语言实现选择排序、冒泡排序和快速排序的代码示例

    C语言实现选择排序、冒泡排序和快速排序的代码示例

    这篇文章主要介绍了C++中实现选择排序、冒泡排序和快速排序的代码示例,例子带有执行时间统计还可以简单看一下效率对比,需要的朋友可以参考下
    2016-04-04
  • c语言线程终止练习示例

    c语言线程终止练习示例

    这篇文章主要介绍了c语言线程终止练习示例,需要的朋友可以参考下
    2014-04-04
  • C++利用opencv实现单目测距的实现示例

    C++利用opencv实现单目测距的实现示例

    本文主要介绍了C++利用opencv实现单目测距的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言文件操作函数freopen详细解析

    C语言文件操作函数freopen详细解析

    替换一个流,或者说重新分配文件指针,实现重定向。如果stream流已经打开,则先关闭该流。如果该流已经定向,则freopen将会清除该定向。此函数一般用于将一个指定的文件打开一个预定义的流:标准输入、标准输出或者标准出错
    2013-10-10
  • 详解C++-(=)赋值操作符、智能指针编写

    详解C++-(=)赋值操作符、智能指针编写

    C++的智能指针是克服C++大坑的非常有用的的手段,之所以说它智能,是因为它为程序员克服了重要的编程问题——悬挂指针,下面通过本文给大家分享C++-(=)赋值操作符、智能指针编写,感兴趣的朋友一起看看吧
    2018-03-03
  • C语言如何实现BOOL类型

    C语言如何实现BOOL类型

    这篇文章主要介绍了C语言如何实现BOOL类型问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言中查询进程信号是否被遮罩或搁置的简单方法

    C语言中查询进程信号是否被遮罩或搁置的简单方法

    这篇文章主要介绍了C语言中查询进程信号是否被遮罩或搁置的简单方法,包括sigprocmask函数和sigpending函数的简介,需要的朋友可以参考下
    2015-09-09

最新评论