终点和起点: 补充解法¶
贡献:Codex(GPT-6)补充经典 Dijkstra 的直接多源初始化,用更直接的状态定义省去虚拟边。首选虚拟点建模见题解。
定义 \(d_v\) 为任意 \(S\) 中起点到 \(v\) 的最小距离。开始时把每个起点的距离设为零,并全部放入最小堆,其余距离为无穷大。此后照常进行 Dijkstra 松弛;结束后在 \(T\) 中取最小距离。
这恰好等价于虚拟起点先弹出,并沿其零权边完成松弛后的状态。之后每次有效弹出与边松弛具有相同意义,因此非负权 Dijkstra 的正确性证明直接适用。对终点集合取最小值,等价于连接虚拟终点的所有零权入边。起点集合为空时堆始终为空,终点集合为空时最小值保持无穷大,两种情况都输出负一。
图仅保存原边;时间 \(O((n+m)\log(n+m+1))\) ,空间 \(O(n+m)\) .它减少了虚拟边和顶点的管理,但没有改变渐进复杂度。距离类型、过时堆项和非负权要求与首选方案相同,支持全部正式数据。
程序:alternative.cpp。