Algorithm 在图中找到成本小于m的最大区域
我试图找到一个算法,给定一个无向图,每一条边的成本为正,可以连接的最大节点数小于总成本m。我已经实现了Prim算法的一个版本(ordernlog(N)),我可以很容易地采用它来查找给定起始节点的最大节点数。然而,在该节点不是最优解的一部分的情况下,这可能会产生问题Algorithm 在图中找到成本小于m的最大区域,algorithm,performance,graph,Algorithm,Performance,Graph,我试图找到一个算法,给定一个无向图,每一条边的成本为正,可以连接的最大节点数小于总成本m。我已经实现了Prim算法的一个版本(ordernlog(N)),我可以很容易地采用它来查找给定起始节点的最大节点数。然而,在该节点不是最优解的一部分的情况下,这可能会产生问题 我当然可以通过在每个节点上循环来解决这个问题,但是这使得解决方案N^2*log(N)看起来有点太多了。有人知道是否有更理想的解决方案吗 这听起来像是一个修改版的 最佳顶点=无 最大值=0 对于graph.Vertex中的v: n=最大
我当然可以通过在每个节点上循环来解决这个问题,但是这使得解决方案N^2*log(N)看起来有点太多了。有人知道是否有更理想的解决方案吗 这听起来像是一个修改版的
最佳顶点=无
最大值=0
对于graph.Vertex中的v:
n=最大面积(图表,成本,v)
如果n>最大值:
最佳顶点=v
最大值=n
def最大_面积(图形、最大_成本、顶点、边=[]):
#基本情况
如果max_cost,如果OP有一个多项式时间的解决方案,那么这一定是一个非常改进的背包版本。尽管重新阅读你的问题-这可能比不上n^2log(n)。@mbeckish我不明白为什么这不会被认为是一个改进的0/1背包问题(运行时间为O(n*W))?因为OP有一个O(n^2logN)解,是多项式的,不是伪多项式O(nW)解。我不是说你的解不适合这个问题-我只是说如果存在多项式解,这个问题和背包之间一定有很大的区别。如果你的权重是整数,你可以在O(m+n)中找到MST使用“最小生成树和最短路径的跨二分法算法”论文的时间。虽然我目前无法访问全文,但看起来它正在完成我已经实现的部分?使用类似dykstra的/贪婪算法以有限的代价找到最小生成树,然而我的问题是,这只适用于给定的起始节点,但理想的解决方案可以是任意给定的起始节点。
best_vertex = None
max = 0
for v in graph.vertices:
n = largest_area(graph, cost, v)
if n > max:
best_vertex = v
max = n
def largest_area(graph, max_cost, vertex, edges=[]):
# Base Case
if max_cost <= 0:
return edges
# Iterate through all the neighbours and find the highest scoring path.
max_vertices = 0
for n in graph.adjacent(vertex):
edge = graph.get_edge(n, vertex)
if edge in edges: continue # We've already taken that route.
num_vertices = largest_area(graph, max_cost - edge.weight, edges + [edge])
if num_vertices > max_vertices:
max_vertices = num_vertices
return max_vertices