← 返回目录

思维导图

第 37 / 42 卷日期:

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即可。由于算法最后的结果是一棵树,因此数组中保存此编号节点的父节点即可。每条路有且仅有一个祖先节点,一步步溯源上去的路径是唯一的。

思维导图

算法总结

图 53-1
图 53-1

链表

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