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

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

(0)

相关推荐

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

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

  • 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算法

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

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

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

  • 必须知道的C语言八大排序算法(收藏)

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序-直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

  • go语言睡眠排序算法实例分析

    本文实例讲述了go语言睡眠排序算法.分享给大家供大家参考.具体分析如下: 睡眠排序算法是一个天才程序员发明的,想法很简单,就是针对数组里的不同的数开多个线程,每个线程根据数的大小睡眠,自然睡的时间越长的,数越大,哈哈,搞笑吧,这种算法看起来很荒唐,但实际上很天才,它可以充分利用多核cpu进行计算. 复制代码 代码如下: package main import (     "fmt"     "time" ) func main() {     tab := []in

  • Go语言通过Luhn算法验证信用卡卡号是否有效的方法

    本文实例讲述了Go语言通过Luhn算法验证信用卡卡号是否有效的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "strings" ) const input = `49927398716 49927398717 1234567812345678 1234567812345670` var t = [...]int{0, 2, 4, 6, 8, 1, 3, 5, 7, 9}

  • C语言选择排序算法及实例代码

    选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置) 3  2  4  1(最初, m

  • C语言基本排序算法之桶式排序实例

    本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以对 n==m, n != m分别处理.写代码时需要注意的的是a[i]是访问第i-1个元素,而非第i个. /************************************************************************************/ /* Bucket_Sort.h

  • C语言基本排序算法之shell排序实例

    本文实例讲述了C语言基本排序算法之shell排序.分享给大家供大家参考,具体如下: shell排序是对直接插入方法的改进方法. /*------------------------------------------------------------------------------------- Shell_sort.h shell排序是对直接插入方法的改进,它并不是对相邻元素进行比较,而是对一定间隔的元素比较. 选择增量序列的几种方法:(为方便,本例采用第一种增量序列) 1. h[1]=

随机推荐