令G
即使在许多受限制的图中,s
感觉就像有人必须考虑过的事情。是否对此进行了任何研究,或者即使对于一般图形,实际上也很容易做到吗?
令G
即使在许多受限制的图中,s
感觉就像有人必须考虑过的事情。是否对此进行了任何研究,或者即使对于一般图形,实际上也很容易做到吗?
Answers:
我不是100%肯定这个答案是正确的,但是这里有:
我认为您可以在具有单个源和单个接收器的DAG中将其减少为从s − t均匀地随机的任何路径。
给定图G
本质上,我正在收集可以在最短路径中使用的所有可能的节点,并将它们放在H中。
有关其工作原理的更多信息:
Dijkstra的最短路径算法通过先运行一个BFS和标记所有节点v ∈ 摹从他们的最短路径小号- v。下一步是去从后面牛逼- 小号,并按照最低邻近节点返回。
v∈G s−v t−s 关键是,在这里您可以选择任何最少相邻的节点。我在这里要做的是每一步都收集所有最不相邻的节点,这意味着我考虑了所有最短路径。
现在您迅速想到了,但是,嘿,为什么要对它们进行指数计算,但我却没有呢?
答案是,因为我使用一个集合来避免两次添加相同的节点,所以避免为每个可能的路径重新计算。
现在我们有了一个DAG,我们可以以任何方式从t - s遍历,并从s - t获得最短的反向路径。该图应将t作为唯一来源,将s作为唯一汇。
如果以上是正确的话,那么我认为我们可以进一步采取措施,并解决以下问题。
给DAG中的每个节点一个节点权重;节点权重将是从该节点到s的路径数。让我们称它为w (v )。
您可以快速计算它们,请参阅在G中找到从s到t的简单路径数的算法。
一旦有了节点权重,就可以通过以下方式统一选择路径:
这是基于Realz Slaw答案中思想的解决方案。基本上,这是对他的思想的重新阐述,可能更清晰或更容易理解。该计划是我们将分两步进行:
首先,我们将构建的曲线图小号具有以下属性:从任何路径小号到吨在小号是从最短路径小号到吨在ģ,并从每一个最短路径小号到吨在ģ也存在于小号。因此,S恰好包含G中最短的路径:所有最短的路径,仅此而已。碰巧的是,S将是DAG。
接下来,我们将来自所有路径均匀地随机采样小号到吨在小号。
只要所有边都具有正权重,该方法就可以推广到任意有向图G,因此我将用这些术语来解释我的算法。令w (u ,v )表示边u → v的权重。(这将概括您给出的问题陈述。如果您有一个未加权的图,则只需假设每个边的权重为1。如果您有一个无向图,则将每个无向的边(u ,v )视为两个有向边u → v 和v → 你。)
Step 1: extract S
Now define the graph S
The graph S
Every shortest path from s
Every path in S
Finally, the absence of zero-weight edges in G
Step 2: sample a random path. Now we can throw away the weights on the edges in S
To help with this, we will do a precomputation to compute n(v)
n(v)=∑w∈succ(v)n(w)
where succ(v)
Next, we use the n(⋅)
choosesuccessor(v):
n = 0
for each w in succ(w):
n = n + n(w)
r = a random integer between 0 and n-1
n = 0
for each w in succ(w):
n = n + n(w)
if r < n:
return w
To choose a random path, we repeatedly iterate this process: i.e., v0=schoosesuccessor
(vi)
Hopefully this helps you understand Realz Slaw's solution more easily. All credit to Realz Slaw for the beautiful and clean solution to this problem!
The one case this doesn't handle is the case where some edges have weight 0 or negative weight. However, the problem is potentially not well-defined in that case, as you can have infinitely many shortest paths.