首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

利用set在C++中实现Dijkstra算法

Dijkstra算法是一种用于解决单源最短路径问题的经典算法,它可以在带权重的有向图中找到从源节点到所有其他节点的最短路径。

在C++中,可以利用set数据结构来实现Dijkstra算法。set是C++标准库中的一个容器,它按照一定的顺序存储元素,并且不允许重复元素存在。在Dijkstra算法中,我们可以使用set来存储待处理的节点,并根据节点的距离值进行排序。

下面是一个利用set实现Dijkstra算法的示例代码:

代码语言:txt
复制
#include <iostream>
#include <set>
#include <vector>
#include <limits>

using namespace std;

const int INF = numeric_limits<int>::max();

// 定义图的邻接表表示
typedef pair<int, int> Edge; // <目标节点, 权重>
typedef vector<vector<Edge>> Graph;

vector<int> dijkstra(const Graph& graph, int source) {
    int n = graph.size();
    vector<int> dist(n, INF); // 存储源节点到各个节点的最短距离
    set<pair<int, int>> pq; // 存储待处理的节点,按照距离值排序

    dist[source] = 0;
    pq.insert({0, source});

    while (!pq.empty()) {
        int u = pq.begin()->second;
        pq.erase(pq.begin());

        for (const auto& edge : graph[u]) {
            int v = edge.first;
            int weight = edge.second;

            if (dist[u] + weight < dist[v]) {
                pq.erase({dist[v], v});
                dist[v] = dist[u] + weight;
                pq.insert({dist[v], v});
            }
        }
    }

    return dist;
}

int main() {
    int n = 5; // 节点数
    int source = 0; // 源节点

    Graph graph(n);

    // 添加边
    graph[0].push_back({1, 10});
    graph[0].push_back({2, 3});
    graph[1].push_back({2, 1});
    graph[1].push_back({3, 2});
    graph[2].push_back({1, 4});
    graph[2].push_back({3, 8});
    graph[2].push_back({4, 2});
    graph[3].push_back({4, 7});
    graph[4].push_back({3, 9});

    vector<int> shortestDist = dijkstra(graph, source);

    // 输出最短路径
    for (int i = 0; i < n; i++) {
        cout << "Shortest distance from node " << source << " to node " << i << ": " << shortestDist[i] << endl;
    }

    return 0;
}

在上述代码中,我们首先定义了一个Graph类型来表示图的邻接表。然后,我们实现了dijkstra函数来计算从源节点到所有其他节点的最短路径。在函数中,我们使用dist数组来存储最短距离,使用pq set来存储待处理的节点,并根据距离值进行排序。最后,我们在main函数中构建了一个示例图,并输出了最短路径。

这是一个基本的利用set在C++中实现Dijkstra算法的示例。在实际应用中,可以根据具体需求进行优化和扩展。腾讯云提供了丰富的云计算产品和服务,例如云服务器、云数据库、人工智能服务等,可以根据具体场景选择适合的产品来支持和扩展应用。

参考链接:

  • Dijkstra算法:https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
  • C++ set文档:https://en.cppreference.com/w/cpp/container/set
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • pgrouting 路径规划_路径分析是什么意思

    PgRouting是基于开源空间数据库PostGIS用于网络分析的扩展模块,最初它被称作pgDijkstra,因为它只是利用Dijkstra算法实现最短路径搜索,之后慢慢添加了其他的路径分析算法,如A算法,双向A算法,Dijkstra算法,双向Dijkstra算法,tsp货郎担算法等,然后被更名为pgRouting[1]。该扩展库依托PostGIS自身的gist索引,丰富的坐标系与图形类型,强大的几何处理能力,如空间查询,空间处理,线性参考等优势,能保障在较大数据级别下的网络分析效果更快更好。   PostGIS早已奠定了最优秀的开源空间数据库地位,在新时代GIS中的应用将会越来越普遍。其实,网络分析算法很多服务端语言如java,C#等虽能实现,但基于真实城市道路数据量较大且查询分析操作步骤复杂与数据库交互频繁,以这类服务端频繁访问数据库导致数据库开销压力较大,分析较慢,故选择PgRouting在数据库内部实现算法,提升分析效率。最后,路径分析不仅仅是最短路径,在实际应用中还有最短耗时,最近距离,道路对车辆类型限制,道路对速度限制等因素,交通事故、市政事故导致的交通障碍点等问题,所有的问题本质其实是对路径分析权重(Weight)的设置问题。

    03

    [图]最短路径-Floyd算法

    > Floyd算法(Floyd-Warshall algorithm)又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。 -来自百度百科 前一篇文章:[第六章 图-Dijkstra算法](https://study.sqdxwz.com/index.php/archives/13/) 我们已经学习过了单源最短路径求解方法,这次我们来学习所有顶点间(任意两点间)的最短路径求解方法-Floyd算法。 对于求解任意两点最短路径的方式,我们也可以采用简单暴力将Dijkstra算法循环n遍(假设存在有n个顶点),也是可以求解任意两点间距离的,但是人类社会之所以会进步,难道仅仅是会使用筷子?还是好好学习更先进的算法-Floyd算法吧! **注:**采用此暴力的时间复杂度为:O(n^3)。

    01
    领券