Dijkstra算法

迪杰斯特拉(Dijkstra)是典型最短路径算法,用于计算一个节点到其他节点的最短路径。

它的主要特点是以起始点为中心向外层层扩展(广度优先搜索的思想),直到扩展到终点为止。

(第一段是抄的,由于本人是个算法小白。官方的话还是抄的好)

有这么一个加权图,Dijkstra算法可以计算任意节点到其他节点的最短路径。
在这里插入图片描述
算法思路:

1.指定一个节点,例如我们要计算‘A’到其他节点的最短路径

2.定义两个集合(S,U),S集合包含已求出的最短路径的点(以及相应的最短长度),U集合包含未求出最短路径的点(以及A到该点的路径长度,上图A->C没有直接路径,初始化为inf(inf==0x7fffffff));

3.初始化两个集合,S初始化时只有当前要计算的节点,A->A = 0;U集合初始化为A->B = 4,A->D = 2,A->C = inf,A->E = inf;

4.从U集合中找出路径最短的点,加入S集合,A->D=2;

5.更新U集合路径,if(‘D’到’B’,‘C’,'E’的距离+‘AD的距离’<'A’到B,C,E的距离)则更新U;

6.循环执行4、5,直到遍历结束,得到A到其他节点的最短路径。

下面贴上一段图解(借鉴的别人的0.0)

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

int Dijkstra(int x, int y) {//点x到点y的距离
    int i, j;
    int book[210];//加入了集合S的点做标记
    memset(book, 0, sizeof(book));
    int dis[210];//集合U
    memset(dis, 0, sizeof(dis));
    for (i = 0; i < n; i++) {
        dis[i] = G[x][i];//先初始化点x到其他的点的距离
    }
    book[x] = 1;
    for (i = 0; i < n; i++) {
        int min1 = inf, k = x;
        for (j = 0; j < n; j++) {
            if (!book[j] && dis[j] < min1) {//找到集合U中路径最短的点
                min1 = dis[j];
                k = j;
            }
        }
        book[k] = 1;
        for (j = 0; j < n; j++) {
            if (!book[j] && dis[j] > min1 + G[k][j]) {//更新
                dis[j] = min1 + G[k][j];
            }
        }

    }
    return dis[y];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值