【问题标题】:Finding maximum number of nodes in set of undirected graphs在一组无向图中查找最大节点数
【发布时间】:2020-01-25 14:06:13
【问题描述】:

我有一组节点 (N=7)

{a, b, c, d, e, f, g}

这些节点形成一个或多个不同的无向图,我想找到具有最大节点数的图。但是,我有一个约束,即复杂性不能超过 (N*M),其中 M 是单个节点具有的最大边数(具有最大边的节点)。这是节点结构的示例

nodes = {a: [b], b: [a, c], c: [b], d:[e, f], e: [d, f], f:[e, d, g], g:[f]}

在这个例子中,我们有两个无向图 1. {a, b, c} 和 2. {d, e, f, g}。所以答案应该是 4。

对于每个节点,我都可以进行图遍历,比如dfs或者bfs,这只有O(V+E)的复杂度(图中的节点数为V,图中的边数为E)。如果像上面这样的节点集中有多个不同的无向图(我直到运行时才知道),就会出现问题。我将不得不遍历节点集中的每个节点,执行导致 O(N*(V+E)) 的 dfs,这不满足时间复杂度约束。我想一旦我在第一张图上执行了 dfs,我就可以从我们正在循环的 N 个节点集中删除它的节点(因此将循环从 N 减少到其他东西),但我不确定这如何影响时间复杂度数学上?以下是我目前正在使用的代码,任何建议将不胜感激。我可能过于复杂了......

def dfs(node_set, n, vis):

   if n not in vis:
       vis.add(n)

       for n in node_set[n]:
           getDfs(node_set,n,vis)

    return visited

graphs = []

for n in nodes:
     graphs.append(getSets(nodes, n, set()))

nums = []

for g in graphs:
     nums.append(len(g))

max_num = max(nums)

>> 4

【问题讨论】:

    标签: python time-complexity depth-first-search graph-traversal undirected-graph


    【解决方案1】:

    下面的方法遍历每个顶点及其边以找到每个图中的完整顶点集。您还必须遍历图的数量以找到图上的最大顶点数。

    def findgraphs(nodes):
        graphs = []
        while nodes:
            graph = set()
            queue = set([next(iter(nodes))])
            while queue:
                nextq = set()
                graph.update(queue)
                for q in queue:
                    nextq.update(n for n in nodes[q] if n not in graph)
                    del nodes[q]
    
                queue = nextq
    
            graphs.append(graph)
    
        return graphs
    
    nodes = {'a': ['b'], 'b': ['a', 'c'], 'c': ['b'], 'd': ['e', 'f'], 'e': ['d', 'f'], 'f': ['e', 'd', 'g'], 'g': ['f']}
    graphs = findgraphs(nodes)
    m = max(len(g) for g in graphs)
    print(m)
    # 4
    

    【讨论】:

    • 我认为这个的时间复杂度大于O(N*M)
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多