首页 > 编程 > C > 正文

C语言实现Floyd算法

2020-01-26 13:49:44
字体:
来源:转载
供稿:网友

本文实例为大家分享了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);   }   } } 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选