DFS stack O(h) 不具有最短性
BFS queue O(2^h) 最短路
初始化:
A
的距离设为 0
。A
加入优先队列。处理队列:
u
。u
的每个邻接节点 v
,计算从 u
到 v
的路径长度,如果该长度小于当前记录的 v
的最短路径,则更新 v
的最短路径并将 v
加入优先队列。- for(int k=1;k<=n;k++)
-
- for(int i=1;i<=n;i++)
-
- for(int j=1;j<=n;j++)
-
- d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
建图邻接列表
计算每个节点的入度:
找到所有入度为 0 的节点并将它们放入队列:
处理队列中的节点:
重复步骤 3,直到队列为空:
当且仅当图中没有奇数环
lambda函数中 >是最小堆, <是最大堆
greater是最小堆,less是最大堆
priority_queue
是最大堆,因为它使用 <
比较函数。这意味着较大的元素具有较高的优先级。greater<>
比较函数,priority_queue
变成了最小堆。greater<>
确保较小的元素具有较高的优先级。auto tupleCmp =[](const auto& e1,const auto& e2){ auto&& [x1,y1,d1]=e1; auto&& [x2,y2,d2]=e2; return d1>d2; };这个是最大堆还是最小堆
堆顶是优先级最高(值最大)的元素。
const auto& e1
和 const auto& e2
:这两个参数是要比较的元素,类型自动推断。auto&& [x1, y1, d1] = e1;
和 auto&& [x2, y2, d2] = e2;
:使用结构化绑定来解包元素。这些元素应该是类似于 tuple
或 pair
的结构,其中 d1
和 d2
是我们要比较的第三个元素(假设它们是优先级或距离)。return d1 > d2;
:比较 d1
和 d2
。如果 d1
大于 d2
,则返回 true
。在 priority_queue
中,如果比较函数返回 true
,表示 e1
应该排在 e2
之前。默认情况下,priority_queue
是最大堆,即较大的元素优先。然而,在这个自定义比较函数中:
d1 > d2
时,e1
被认为优先级更高,排在 e2
前面。d
会被认为优先级较低。这个比较函数实际上创建了一个 最小堆,因为 priority_queue
会根据 d
的值按升序排列,即优先处理 d
值较小的元素。