繁体   English   中英

有向加权边缘图及其权重的算法

[英]Algorithm for directed weighted edge graphs and their weights

我有一个有向图,边缘上有非负权重。

我的算法应执行以下操作:

  • 获取从顶点u到顶点v的所有路径。
  • 计算从u到v的每条路径上的最小加权边。
  • 计算我从上面计算出的最小加权边的最大值。

什么算法对此有好处? 我之所以这么问,是因为我可以天真地执行上述步骤(蛮力)。

我感觉这是对Dijkstra算法的略微修改,但我不确定。 另外,时间复杂度是多少?

我认为我们这里不需要dijkstra。 假设我们选择了具有所需的最小最大边缘的路径。 它显然不包括权重较小的边。 所以算法是

  • 选择K最重的边缘
  • 使用dfs / bfs来检查u是否可以通过此边缘到达vf(K) is true
  • 如果K1>K2并且f(K2) is true ,则显然f(K1) is true
  • 这样我们就可以对K执行二进制搜索

时间复杂度为O((N+M) log M) ,其中N顶点数和M边数

任何真正考虑从u到v的所有路径的算法都将花费指数时间,因为这种路径的数量是指数的-考虑一个梯子或2xN节点的网格-从一端到另一端沿着您的长维度具有至少N个独立的选择,因此至少2 ^ N个可能的路径。

我认为您可以修改Dijkstra的算法来做到这一点。 https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Pseudocode中有伪代码。 作为第一个修改,更改第6行以将所有初始距离设置为零。 我们需要考虑不变量,我们的第一个不变量可以是dist [v]是至v的路径中的最小边的最大值,对于到目前为止已看到的所有路径。 和之前一样,我们将prev [v]设置为undefined并将v添加到Q,该队列保存当前正在考虑的所有节点。 作为初始化的最后一部分,我们设置dist [source] = infinity-而不是0。您可以将其视为hack,也可以将其定义为从v到v的长度为0的路径中的最小边长度,没有任何优势。

现在,我们拥有Q包含所有仍在考虑最小边的最大值的节点,并且所有此类节点的该值只会不断增加。 现在我们从Q中删除具有dist [u]最大值的节点u-这是第13步,将min更改为max。 对于u的每个邻居v,我们计算min(dist [v],length(u,v))。 这是沿从源到u的任何路径上最大可能的最小边长的新候选者,因此,如果它大于dist [u],则将dist [u]设置为该值。 请注意,这意味着Q的元素u都不会将dist [u]的值设置为大于我们刚刚删除的Q的元素v的dist [v]的值,这是队列中的最大值那时候。 这意味着,一旦我们从队列中删除了元素v,它的值dist [v]就已经确定好了,以后的任何计算都不能增加。 请注意,我们刚刚更改了队列Q中某个节点的dist [u]。如果Q是使用诸如优先级队列之类的数据结构实现的,则这可能意味着该实现将必须在旧版本的优先级队列中删除u值dist [u],然后在dist [u]的新值下重新插入。

正确性来自于不变量-每次使dist [v]沿到目前为止所考虑的每条路径的最小边的最大值dist,并且当我们从队列中删除v时,我们都知道-因为它对于仍然存在于队列中的所有对象都具有最大值队列-我们可以考虑的其他路径都无法更改该值。

出于相同的原因,执行此操作所需的时间与Dijkstra相同。 首先,我们将每个元素输入队列一次,然后将每个元素从队列中删除一次。 这告诉我们在第14行中执行了多少次删除操作。

(要计算最小加权边的最大值似乎很奇怪-这里是否有有趣的应用程序,还是让您考虑Dijkstra算法的人工练习?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM