美文网首页
Dijstra算法的C++实现

Dijstra算法的C++实现

作者: crazyhank | 来源:发表于2019-12-08 20:28 被阅读0次

图论中Dijstra算法算是比较经典的算法,它解决的是一个有权图中,指定起始点到其他顶点的最短距离,采用的是BFS的思想,网上有很多版本,我这里参考youtube上的教程:https://www.youtube.com/watch?v=9wV1VxlfBlI
,基于C++语言以及priority queue实现了一下,有兴趣的同学可以研究下:

#include <iostream>
#include <map>
#include <vector>
#include <queue>
#include <limits.h>
#include <set>

using  namespace std;
struct Dist {
    char id;    // 顶点
    int dist;   // 目标点到该顶点的距离
    bool operator < (const Dist& a) const {
        return this->dist > a.dist;
    }
};

class Solution {
public:
    void getShortestDist(map<char, vector<Dist>>& graph, map<char, int>& dists, char start) {
        priority_queue<Dist> myQ;       // 采用优先队列处理图中的顶点,并且重载<运算符,构建最小堆
        set<char> mySet;                // 采用set容器记录已处理的顶点
        Dist firstOne = {start, 0};
        myQ.push(firstOne);

        while (!myQ.empty()) {
            Dist tmpD = myQ.top();
            myQ.pop();  // 一定要在这里马上pop掉,否则在后面pop的话可能不是tmpD的顶点!!!!
            if (mySet.find(tmpD.id) == mySet.end()) {
                for (auto& d : graph[tmpD.id]) {
                    if (mySet.find(d.id) != mySet.end()) {
                        continue;
                    } else {
                        Dist nextD;
                        nextD.id = d.id;
                        nextD.dist = d.dist + tmpD.dist;
                        //cout << "nextD.id = " << nextD.id << ", dist = " << nextD.dist << endl;
                        myQ.push(nextD);
                    }
                }
                mySet.insert(tmpD.id);
                dists[tmpD.id] = tmpD.dist;
            } else {
                continue;
            }
        }
    }
};

int main() {
    map<char, vector<Dist>> myGraph;     // 存放图的描述信息
    map<char, int> shortestDists;       // 存放目标点到各点之间的最短距离

    // 创建一个测试图
    myGraph = {
            {'A', {{'B', 5}, {'C', 1}}},
            {'B', {{'A', 5}, {'C', 2}, {'D', 1}}},
            {'C', {{'A', 1}, {'B', 2}, {'D', 4}, {'E', 8}}},
            {'D', {{'B', 1}, {'C', 4}, {'E', 3}, {'F', 6}}},
            {'E', {{'C', 8}, {'D', 3}}},
            {'F', {{'D', 6}}}
    };

    Solution solver;
    solver.getShortestDist(myGraph, shortestDists, 'A');
    // 打印结果
    for (auto it : shortestDists) {
        cout << "To " << it.first << ": shortest dist = " << it.second << endl;
    }

    return 0;
}

相关文章

  • Dijstra算法的C++实现

    图论中Dijstra算法算是比较经典的算法,它解决的是一个有权图中,指定起始点到其他顶点的最短距离,采用的是BFS...

  • Dijstra算法详解

    常用的机器人导航算法中求取最短路径的算法除了A算法以外,Dijstra(迪杰克斯拉)算法也是广泛使用的一种算法。通...

  • 2018-07-04 PATA1003 穷举法无法通过所有测试点

    因为只是单源单目的的情境,Dijstra算法好像大材小用,我就试着穷举没一个路径,递归实现最后的结果。但只有前两...

  • C++ 经典算法集锦 二

    C++经典算法实现系列2 上回我们说道,牛逼的C++可以实现很多牛逼的算法。我们继续之前的记录。 Algorith...

  • 排序算法详细代码实现

    算法分类 算法时间复杂度 选择排序 插入排序 C++实现 Python实现 冒泡排序 Python实现 归并排序 ...

  • Dijstra算法与搜索算法

    Dijistra其实就是一种搜索算法, 它是BFS的升级版。假设每条路径的值为1,那么两点之间的最短路径可以直接用...

  • 2018-07-22

    最短路径算法之Dijkstra算法 基本思想 通过Dijstra计算图G中的最短路径时,需要指定起点s(即从顶点s...

  • Unity学习笔记——A*寻路算法的应用

    初步了解了一些寻路算法后,本以为dijstra是比较合适的寻路算法,今天仔细看了关于A星寻路算法的教程和视频后,我...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • AES加密算法和RSA加密算法

    引用 AES加密算法原理AES加密算法的C++实现密码算法详解——AES(高级加密算法) 1. 前言 本文针对加密...

网友评论

      本文标题:Dijstra算法的C++实现

      本文链接:https://www.haomeiwen.com/subject/imfvgctx.html