首页 > 技术文章 > 用弗洛伊德算法求任意两点间最短路径(C语言)

mcl19909949541 2021-04-18 11:30 原文

这题我在上个代码中已经写出来对应函数了,就在贴一遍吧。

用弗洛伊德算法求任意两点间最短路径(C语言)

题目

在这里插入图片描述

代码

#include <stdio.h>
#include <stdlib.h>


struct graphList
{
    int vexNum;
    int graph[120][120];
};

int P[120][120];//记录对应点的最小路径的前驱点,例如p(1,3) = 2 说明顶点1到顶点3的最小路径要经过2

void createNewGraphList(struct graphList *gList)
{
    int i,j;
    scanf ("%d", &(gList -> vexNum));
    for (i=0;i < gList->vexNum; i++)
    {
        for (j = 0; j < gList -> vexNum; j++)
        {
            scanf ("%d", &(gList -> graph[i][j]));
        }
    }
}

void floydAlgorithm(struct graphList *gList)
{
      int v,w,k;
       //初始化floyd算法的最小路径矩阵
    for(v = 0; v < gList->vexNum; v++){
        for(w = 0; w < gList->vexNum; w++){
            P[v][w] = w;
        }
    }


    //这里是弗洛伊德算法的核心部分
    //k为中间点
    for(k=0;k<gList->vexNum;k++)
    {//v为起点
         for(v=0;v<gList->vexNum;v++)
         { //w为终点
             for(w=0;w<gList->vexNum;w++)
             {
                 if(gList->graph[v][w]>gList->graph[v][k]+gList->graph[k][w])
                 {
                     gList->graph[v][w]=gList->graph[v][k]+gList->graph[k][w];//更新最小路径
                      P[v][w] = P[v][k];//更新最小路径中间顶点
                 }
             }
         }
    }
}

void putOutMinStepNum(struct graphList *gList)
{
    int n;
    int a[10];
    int i, j,k=0;
    scanf ("%d", &n);//需输出的个数
    while (n--)
    {
        scanf ("%d%d", &i, &j);
       a[k]=gList -> graph[i][j];
       k++;
    }
    for(i=0;i<k;i++)
        printf("%d\n",a[i]);
}

void  putOutMinStep()
{
    int i,j;
    int n;
    int a[100][100];
    scanf("%d",&n);
    for(int t=0;t<n;t++)
    {
        scanf("%d %d",&a[t][0],&a[t][1]);
    }
   for(int t=0;t<n;t++)
     {

        int k=P[a[t][0]][a[t][1]];
        printf("%d\n", a[t][0]);//打印起点
            while(k!=a[t][1])
            {
                 printf("%d\n", k);//打印中间点
                k = P[k][a[t][1]];
            }
        printf("%d\n",k);//打印中间点
     }

}
int main()
{
    struct graphList gList;
    createNewGraphList(&gList);
    floydAlgorithm (&gList);
    //putOutMinStepNum (&gList);
    putOutMinStep();
    return 0;
}

如图:
在这里插入图片描述

推荐阅读