思维导图
Polar(int dist, int id) : dist(dist), id(id){} };
然后确定
struct cmp{ bool operator ()(Polar a, Polar b){ // 重载()运算符,使其成为一个仿函数
return a.dist > b.dist;// 这里是大于,使得距离短的先出队 }
};
priority_queue<Polar, vector<Polar>, cmp> Q;//小顶堆 int vis[n] //建立是否访问过的节点判断数组
算法实现:
void Dij(int s)
{ dist[s] = 0;
Q.push(Polar(0, s));
while (!Q.empty())
{ int p = Q.top().id;
Q.pop();
if (vis[p])
continue;
vis[p] = 1;
for (int e = head[p]; e != 0; e = edges[e].next)
{ int to = edges[e].to;
dist[to] = min(dist[to], dist[p] + edges[e].w);
if (!vis[to])
Q.push(Polar(dist[to], to));
} }
}
怎样打印路径?
只需要建立一个pre数组,在更新dist时候更新pre即可。由于算法最后的结果是一棵树,因此数组中保存此编号节点的父节点即可。每条路有且仅有一个祖先节点,一步步溯源上去的路径是唯一的。
思维导图
算法总结

链表
全站分卷索引 · 42 卷
- 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
- 2找出所有子集的异或总和再求和
- 3哈希表
- 4哈希冲突
- 5红黑树与AVL树
- 6平衡二叉树(AVL树)
- 7将有序数组转换为二叉搜索树
- 83. 分割(组合问题)
- 9方法论
- 10509. 斐波那契数
- 1162. 不同路径
- 1296. 不同的二叉搜索树
- 13322. 零钱兑换
- 14爬楼梯
- 15背包小总结 (01背包、完全背包)
- 16子序列问题
- 17674. 最长连续递增序列
- 18115. 不同的子序列
- 19总结
- 20技巧总结
- 21时间序列模型
- 22区间DP模型
- 23664. 奇怪的打印机
- 24编辑距离
- 25回文串
- 26DP递推公式总结
- 27排序算法
- 28其他算法
- 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
- 302. TOP N问题
- 313. 分布式的TOP N问题
- 322. Astar数据结构 + 公式
- 334. 代码实现
- 345. 总体代码
- 35堆排序
- 36单源最短路
- 37思维导图
- 38链表
- 39回溯
- 40贪心
- 41动态规划
- 42排序