没想到竟然断更一个多月。博主研究牲一枚,上一个月因为大大小小的原因换了个导师,期间十分痛苦不堪,因此断更。现在已经成功换导师,重启本更新。祝天下所有研究生都能开开心心健健康康每一天。
题目详见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更快:] )
注释代码
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;
};
笔者也在新手学习期中,所写的内容主要与大家交流学习使用,如有发现任何问题敬请指正!