- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
创意题第34题来自this page .
Monotonic shortest path. Given an edge-weighted digraph, find a monotonic shortest path from s to every other vertex. A path is monotonic if the weight of every edge on the path is either strictly increasing or strictly decreasing.
Partial solution: relax edges in ascending order and find a best path; then relax edges in descending order and find a best path.
我的问题:
假设我们按降序放宽边,并且我们可以选择在一个点上使用多于 1 条边。我们将在什么基础上选择下一个优势?理想情况下,我们应该选择较小的边,因为它会最小化到该顶点的距离。但是,如果离开该顶点的所有边的权重都大于当前边的权重,那么这样做可能会导致该顶点没有进一步的路径。
那么,我们该如何解决这个问题呢?
最佳答案
这个问题可以通过修改Dijkstra算法来解决。要点是放松不应在每个图节点(像往常一样)中使用 min
操作,而应在优先级队列中进行。
这是对常用 Dijkstra 算法的修改列表。我只考虑按升序排列的边的松弛,这会导致最短路径严格递减(要获得递增的最短路径,请更改第 2 项和第 4 项):
该算法保证每条边最多被处理一次(如果同时考虑严格递减和严格递增路径,则最多处理两次),因此其复杂度为 O(E log E)。
C++11 实现:
void getDecreasingSP(Vertices& vertices, Edges& edges, int src)
{
for (auto& v: vertices)
sort(begin(v.outEdges), end(v.outEdges),
[&](int from, int to)
{
return edges[from].weight < edges[to].weight;
});
PQ pq;
auto& src_v = vertices[src];
for (auto e: src_v.outEdges)
{
QEntry entry {edges[e].weight, e};
pq.push(entry);
++src_v.pos;
}
while(!pq.empty())
{
QEntry top = pq.top();
pq.pop();
auto& v = vertices[edges[top.inEdge].to];
while (v.pos < int(v.outEdges.size()) &&
edges[v.outEdges[v.pos]].weight < edges[top.inEdge].weight)
{
auto e = v.outEdges[v.pos];
edges[e].backPtr = top.inEdge;
QEntry entry {top.pathWeight + edges[e].weight, e};
pq.push(entry);
++v.pos;
}
if (v.backPtr == -1)
v.backPtr = top.inEdge;
}
}
另见 working code on Ideone .以及图形的可视化(由这段代码在 Graphviz 的帮助下生成),其中突出显示了严格递减的最短路径之一:
关于algorithm - 在 O(E logV) 的图中找到单调最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876105/
我正在寻找一种快速方法来使 pandas 数据帧在 x 中单调。 我当前的解决方案如下: def make_monotonic(df, cols=None): """make df monot
CLOCK_REALTIME 的一个问题是它不是单调的,如果发生 NTP 同步,时间可能会倒退。 像下面这样的事情让它变得单调是否安全? struct timespec GetMonotonicTim
我是一名优秀的程序员,十分优秀!