加载中...

edu 102 E(dijkstra多状态设计)

E

很容易想到单源最短路,难点在于如何定义 \(dist\) 数组的状态。

其实也并不算是难点,定义也并不复杂,只要能发现某个简单的定义和原问题等价,便解决了问题。

题目所求为 \(1\) 到某个点 \(u\) 的所有路径中(没有强调简单路径,因此路径上的点可重复),“路径总权值-路径最大边权+路径最小边权”的最小值。原始的 \(Dijkstra\) 求最短路只考虑了最小化路径总权值,现在同样是求最小值,但需要额外引入 “路径最大边权” 和 “路径最小边权” 这两个因素。显然不可以直接将这两个因素作为状态转移,因为边权范围太大了。

考虑简化状态设计,使得最终得到的答案与原问题等价

如果不考虑路径中的最大和最小边权,只是考虑删除路径中某条边的贡献,并重复计入路径中某条边的贡献,那么显然:若想让最终路径总权值最小化,删除边必然是权值最大的边,增加边必然是权值最小的边,这恰好是原问题的形式。因此,上述简化的状态定义与原问题是等价的。

故考虑状态设计:\(dist_{u,j1,j2}\):从源点 \(1\) 到点 \(u\),考虑所有可行路径,\(j1 \in \{0,1\}\) 表示是否删除路径中某条边的贡献;\(j2 \in \{0,1\}\) 表示是否重复计入路径中某条边的贡献,最短路。

\(init: dist[1][0][0] = 0, dist[其他] = inf\)

\(ans: dist[2 \backsim n][1][1]\)

\(trans:\) 只需要考虑当前松弛的边的 \(4\) 种状态——既不删除也不增加,删除,增加,既删除又增加。具体转移细节见代码。

状态数只是变为了原来的 \(4\) 倍,因此时间复杂度仍为普通 \(dijkstra\) 求最短路的复杂度:\(O(mlogn)\)

code

posted @ 2025-08-05 13:11  jxs123  阅读(7)  评论(0)    收藏  举报