【发布时间】: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