在多个顶点的最大距离内提取子图的高效算法

时间:2017-03-03 05:48:32

标签: algorithm graph

我有一个算法问题,有一个简单的解决方案,但它似乎很浪费。我想知道是否有更有效的方法来做同样的事情。

问题在于:

  • 输入:具有非负边缘权重(解释为长度)的大图G,顶点列表v以及与d长度相同的距离列表v {1}}。
  • 输出:S的子图G包含距离d[i]至少v[i]的所有顶点i v[i]

显而易见的解决方案是从每个d[i]开始使用Dijkstra算法,进行修改,使其在达到v[i]的距离后退出,然后取出每个搜索遍历的子图的并集。但是,在我的用例中,经常出现v s的搜索树大量重叠的情况。这意味着在我结合之前,Dijkstra方法会浪费地多次遍历重叠中的顶点。

如果O(|S|log|S|)中只有一个顶点,则Dijkstra方法在|S|中运行,将v作为顶点数(我的图形稀疏,所以我忽略边缘术语)。当v[i]有多个顶点时,是否有可能实现相同的渐近运行时间?

我的第一个想法是将每个v[i]中的搜索组合到同一个优先级队列中,但上面提到的“纾困”条件使这种方法复杂化。有时候,距离一个v[j]的距离较短,但是如果第二个顶点分配的d[j]更大,你仍然希望从另一个Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.gecko.driver system property; for more information, see https://github.com/mozilla/geckodriver. The latest version can be downloaded from https://github.com/mozilla/geckodriver/releases at com.google.common.base.Preconditions.checkState(Preconditions.java:738) at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:111) at org.openqa.selenium.firefox.GeckoDriverService.access$100(GeckoDriverService.java:38) at org.openqa.selenium.firefox.GeckoDriverService$Builder.findDefaultExecutable(GeckoDriverService.java:112) at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:302) at org.openqa.selenium.firefox.FirefoxDriver.createCommandExecutor(FirefoxDriver.java:312) at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:272) at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:267) at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:263) at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:122) at Test.main(Test.java:7) 中搜索一个顶点。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过单个Dijkstra运行的复杂性来解决这个问题。

令D为d中距离的最大值。

定义一个新的起始顶点,并为v。

中的每个顶点赋予它边缘

start和v [i]之间的边长应设为D-d [i]。

然后在这个新图中,S由起始顶点的长度D内的所有顶点给出,因此将Dijkstra应用于起始顶点。