我有一个算法问题,有一个简单的解决方案,但它似乎很浪费。我想知道是否有更有效的方法来做同样的事情。
问题在于:
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)
中搜索一个顶点。
谢谢!
答案 0 :(得分:1)
您可以通过单个Dijkstra运行的复杂性来解决这个问题。
令D为d中距离的最大值。
定义一个新的起始顶点,并为v。
中的每个顶点赋予它边缘start和v [i]之间的边长应设为D-d [i]。
然后在这个新图中,S由起始顶点的长度D内的所有顶点给出,因此将Dijkstra应用于起始顶点。