Dijkstra算法

Dijkstra算法是用来求单原最短路径的算法,对于有向图和无向图都适用

Dijkstra算法

数据结构

int dist[1001];//表示v到i节点的最短距离
int already[1001];//表示已经找到最短距离的点
int edge[101][101];//存储边
int p[1001];//存储节点

算法思路

  1. 首先初始化,将和v节点有直接路径的点的dist赋值为edge[v][i],一开始already数组中只有v一个节点
  2. 通过找不在already数组中的点,并且dist最小的点,将其序号赋给k,并将这个点放到already中
  3. 通过对于每一个不在already中的点i比较dist[k]+edge[k][i]是否小于dist[i],如果是,将dist[i]重新赋值,并且将k赋给i的前一个节点,重复第二步
    for (i = 0; i < n ; i++){
        dist[i] = edge[v][i];
        p[i] = -1;
        already[i] = 0;
    }
    dist[v] = 0;
    already[v] = 1;
    for (i = 1; i < n ; i++){
        min = Infinity;
        for (j = 0; j < n ; j++){
            if (!already[j] && dist[j] < min){
                k = j;
                min = dist[j];
            }
        }
        already[k] = 1;
        for (j = 0; j < n ; j++){
            if (!already[j] && (dist[j] > min+edge[k][j])){
                dist[j] = min+edge[k][j];
                p[j] = k;
            }
        }
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值