Leetcode-2642-设计可以求最短路径的图类-c++

本文介绍了一道LeetCode题目,涉及设计一个支持Dijkstra算法的图类,重点在于如何使用C++STL中的vector、pair和priority_queue实现图的结构以及计算最短路径。作者分享了实现过程和可能遇到的难点,如C++STL的调用和优先队列的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

没想到竟然断更一个多月。博主研究牲一枚,上一个月因为大大小小的原因换了个导师,期间十分痛苦不堪,因此断更。现在已经成功换导师,重启本更新。祝天下所有研究生都能开开心心健健康康每一天。


题目详见https://leetcode.cn/problems/design-graph-with-shortest-path-calculator
总体来说这道题虽然为困难难度的题目,但是其并没有太复杂的算法和技巧,我认为其主要难点在于:

  • 各种C++ STL的调用
  • init,增边,最短路径 三个函数。其实也就是题目为什么叫设计以求最短路径的图类,难点是设计。
  • dijkstra

本题中使用到的STL有,附我做题时搜过的链接

vector (太多了真的太多了)
pair (pair1)
priority_queue(priority_queue1, priority_queue2)

dijkstra算法的资料(其实Floyd更快:] )

dijkstra-知乎

注释代码

class Graph {
public:
	// 定义了一个新的类型pii,它就是pair<int, int>
    using pii = pair<int, int>;
    Graph(int n, vector<vector<int>>& edges) {
    	// this代表正在构造的那个Graph对象实例
    	// 通过this->graph可以访问并初始化该对象的graph成员变量
        this->graph = vector<vector<pii>>(n);
        for (auto &vec : edges) {
            int x = vec[0];
            int y = vec[1];
            int cost = vec[2];
            graph[x].emplace_back(y, cost);
        }
    }
    
    void addEdge(vector<int> edge) {
        int x = edge[0];
        int y = edge[1];
        int cost = edge[2];
        // 因为 this->graph = vector<vector<pii>>(n)
        // 所以这里的graph[x]实际上是一个vector<pii>类型的对象
        // 所以实际上是调用了vector.emplace_back方法
        // 塞进去了一个pair对象
        graph[x].emplace_back(y, cost);
    }
    
    int shortestPath(int node1, int node2) {
    	// 这里请参考知乎文章(https://zhuanlan.zhihu.com/p/478887055)
    	// 对基本数据类型来说,下面两种优先队列的定义是等价的
    	// priority_queue<int> q;
		// priority_queue<int,vector<int>,less<int>> q;
		// 可以发现,第二种定义方式的尖括号内多出了两个参数
		// 其中 vector<int>(也就是第二个参数)填写的是来承载底层数据结构堆(heap)的容器,如果第一个参数是 double 型或 char 型,则此处只需要填写 vector<double> 或 vector<char>
		// 而第三个参数 less<int> 则是对第一个参数的比较类
		// less<int> 表示数字大的优先级越大,而 greater<int> 表示数字小的优先级越大。
        priority_queue<pii, vector<pii>, greater<pii>> pq;	//数字小的优先级越大
        // 使用INT_MAX初始化除初始节点之外的所有结点的距离为∞正无穷。(问为什么的请去学习dijkstra算法!)
        vector<int> dist(graph.size(), INT_MAX);
        // 初始化除初始节点的距离为0
        dist[node1] = 0;
        // 初始节点加入队列
        pq.emplace(0, node1);
        while (!pq.empty()) {
        	// 注意这里cost和index顺序翻了一下
            auto [cost, cur] = pq.top();
            pq.pop();
            // 重点则返回cost,注意这里的cost就是最小的cost
            if (cur == node2) {
                return cost;
            }
            // dijkstra核心代码
            // 核心思想就是:递归地,使用当前节点距离初始点的距离,结合(加上)当前节点到其余节点的距离,更新其余节点的距离。
            for (auto [next, ncost] : graph[cur]) {
                if (dist[next] > cost + ncost) {
                    dist[next] = cost + ncost;
                    pq.emplace(cost + ncost, next);
                }
            }
        }
        return -1;
    }
private:
    vector<vector<pii>> graph;
};

笔者也在新手学习期中,所写的内容主要与大家交流学习使用,如有发现任何问题敬请指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值