最短路径 Dijkstra算法 HDOJ_2544

本文提纲

  1. 算法简介
  2. 算法思想
  3. 代码实现
  4. 反思与感悟

1.算法简介

Dijkstra算法,用于计算正权图上的单源最短路,即从单个源点出发,到所有结点的最短路。该算法适用于有向图和无向图,不能处理带有负权的图。

2. 算法思想

思想为单源点加入集合,更新dis[]数组,每次取dis[]最小的那个点,加入集合,再次更新dis[]数组,取点加入集合,直到所有的点都加入集合中

3.代码实现

以杭电2544题为例:

#include <stdio.h>
#include <string.h>
#define M 105
#define INF 0x3f3f3f3f

int map[M][M], low[M], n, m;
bool vis[M];

int dijstra(){
    int ans = 0, pos, min, i, j;

    //初始化数据
    for(i = 2; i <= n; i ++){
        //把和起点相连的顶点都加上权值
        low[i] = map[1][i];
        //标记都为0,表示都没有求到最短路径
        vis[i] = 0;
    }

    //表示起点不用最短路径
    vis[1] = 1;
    low[1] = 0;
    pos = 1;
    //主循环,每次循环求得起点与一个顶点的最短路径
    for(i = 2; i < n; i ++){
        min = INF;
        //找到一条最短路径
        for(j = 2; j <= n; j ++){
            if(!vis[j]&&low[j]<min){
                min = low[j];
                pos = j;
            }
        }
        //
        ans += min;
        //将这个已经找到最短路径的节点标记为已遍历
        vis[pos] = 1;
        //通过已遍历的这个节点找到下一层节点,并更新low数组的值,相当于一次松弛操作
        for(j = 2; j <= n; j ++){
            if(!vis[j]&&low[j] > low[pos]+map[pos][j])
                low[j] = low[pos]+map[pos][j];
        }
    }
    return low[n];
}

int main(){
//    freopen("test.txt","r",stdin);
//    freopen("test.txt","w",stdout);
    while(scanf("%d%d", &n, &m), n||m){
        int i, j, a, b, c;
        for(i = 0; i <= n; i ++){
            for(j = 0; j <= n; j ++)
                map[i][j] = INF;
        }

        for(i = 0; i < m; i ++){
            scanf("%d%d%d", &a, &b, &c);
            if(map[a][b] > c){
                map[a][b] = map[b][a] = c;
            }
        }
        printf("%d\n", dijstra());
    }
//    fclose(stdin);//关闭文件
//    fclose(stdout);//关闭文件
    return 0;
}

4.思想感悟

本次实现的Dijkstra算法还不是最优的,可以有队列进行优化,达到ElogV复杂度的最优算法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值