Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在图中找到成本小于m的最大区域_Algorithm_Performance_Graph - Fatal编程技术网

Algorithm 在图中找到成本小于m的最大区域

Algorithm 在图中找到成本小于m的最大区域,algorithm,performance,graph,Algorithm,Performance,Graph,我试图找到一个算法,给定一个无向图,每一条边的成本为正,可以连接的最大节点数小于总成本m。我已经实现了Prim算法的一个版本(ordernlog(N)),我可以很容易地采用它来查找给定起始节点的最大节点数。然而,在该节点不是最优解的一部分的情况下,这可能会产生问题 我当然可以通过在每个节点上循环来解决这个问题,但是这使得解决方案N^2*log(N)看起来有点太多了。有人知道是否有更理想的解决方案吗 这听起来像是一个修改版的 最佳顶点=无 最大值=0 对于graph.Vertex中的v: n=最大

我试图找到一个算法,给定一个无向图,每一条边的成本为正,可以连接的最大节点数小于总成本m。我已经实现了Prim算法的一个版本(ordernlog(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