求最短路径问题(二)

这一部分,我们开始讲求最短路径的另一个算法,这个算法就是实现了求所有节点到所有节点的最短路径。直接上代码看看:

#include "stdio.h"


#define MAXVEX 9
#define INFINITY 0xffff
typedef int pathmatirx[MAXVEX][MAXVEX];
typedef int shortPathTable[MAXVEX][MAXVEX];
typedef char VertexType;



typedef struct
{
    VertexType vexs[MAXVEX];
    int        matirx[MAXVEX][MAXVEX];
    int        namVertexes, numEdges;
}MGraph;


void shortestPath_Floyd(MGraph G, pathmatirx *p, shortPathTable *D)
{
    int v, w, k;
    for (v = 0; v < G.namVertexes; ++v)
    {
        for (w = 0; w < G.namVertexes; ++w)
        {
            (*D)[v][w] = G.matirx[v][w]; // D[v][w]值即为对应点间的权值
            (*p)[v][w] = w;              // 初始化P
        }
    }


    for (k = 0; k < G.namVertexes; ++k)
    {
        for (v = 0; v < G.namVertexes; ++v)
        {
            for (w = 0; w < G.namVertexes; ++w)
            {
                if ((*D)[v][w] > (*D)[v][k] + (*D)[k][w])
                {
                    (*D)[v][w] = (*D)[v][k] + (*D)[k][w];
                    (*p)[v][w] = (*p)[v][k];
                }
            }
        }
    }

    for (v = 0; v < G.namVertexes; ++v)
    {
        for (w = v + 1; w < G.namVertexes; w++)
        {
            printf("v%d-v%d weight: %d",v, w, (*D)[v][w]);
            k = (*p)[v][w];
            printf("path: %d", v);
            while (k != w)
            {
                printf(" -> %d", k);
                k = (*p)[k][w];
}
            printf(" -> %d\n", w);
        }
        printf("\n");
    }

}

int main(void)
{
    shortPathTable weight;
    pathmatirx     path;
    MGraph         G = {.matirx = {{0,        1,        5,        INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY},
                                   {1,        0,        3,          7,      5,        INFINITY, INFINITY, INFINITY, INFINITY},
                                   {5,        3,        0,        INFINITY, 1,        7,        INFINITY, INFINITY, INFINITY},
                                   {INFINITY, 7,        INFINITY, 0,        2,        INFINITY, 3,        INFINITY, INFINITY},
                                   {INFINITY, 5,        1,        2,        0,        3,        6,        9,        INFINITY},
                                   {INFINITY, INFINITY, 7,        INFINITY, 3,        0,        INFINITY, 5,        INFINITY},
                                   {INFINITY, INFINITY, INFINITY, 3,        6,        INFINITY, 0,        2,        7},
                                   {INFINITY, INFINITY, INFINITY, INFINITY, 9,        5,        2,        0,        4},
                                   {INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, 7,        4,        0}},
                         .namVertexes = MAXVEX
                        };
    shortestPath_Floyd(G, &path, &weight);
    printf("Floyd\n");
    return 0;
}

看代码,p数组存放的是对应两个节点之间的前驱节点,我感觉看了代码之后基本能够说明这个算法了,就不再详细说了。这个算法的复杂度高O(n3),如果你是需要求所有节点到所有节点的最短距离,那么你就可以使用这个算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值