用弗洛伊德算法求赋权图的两点间最短路径的长度(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;
    scanf("%d %d",&i,&j);
    int k=P[i][j];
    printf("path: %d", i);//打印起点
    while(k!=j)
    {
         printf("%d\n", k);//打印中间点
        k = P[k][j];
    }
    printf("%d",k);//打印中间点
}

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

输出:
在这里插入图片描述
说实话这个弗洛伊德算法比迪杰斯特拉算法简单还好用,真是不像话。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mcl19909949541

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值