给定无向连通图,查找其删除会断开该图的所有节点对(通过边连接)
没有平行边,也没有将节点连接到自身的边。
这个问题似乎类似于寻找一个连通的无向图的连接点(或桥),但有一个转折点,我们必须移除一对由边连接的顶点(以及所有其他与该对连接的边)。
这是一个家庭作业问题。我一直在尝试解决这个问题,阅读有关DFS和关节点算法(即每个节点的深度和低点)的文章,但这些方法都不能解决这个特定的问题。我查阅了科曼的算法简介,但并没有合适的主题(当然,这本书有1500页)。
虽然找到关节点(大多数情况下)也会找到这样的一对,但有很多不是关节点的对-考虑一个有4个顶点、5个边(带一条对角线的正方形)的图:它有一对这样的对,但没有关节点(也没有桥)。
我迷路了。帮帮我,栈溢,你是我唯一的希望。
断开图的k条边的集合称为k割。您试图枚举图的所有2-割。
本文描述了一种枚举图的所有割集的有效算法。应该可以对其进行调整,以找到图的所有2-割。
根据@MkjG关于使用DFS计算关节点的建议,更新我之前的回答。
设图为G=(V, E),V:={v_1,...,v_n}_。对于V的每个子集,设G_V是由节点V\V组成的节点诱导子图。对于G连通,如果G_{v}不连通,我们称V中的v为关节点。设N_v是G中v的邻居集。
关节点可以通过DFS计算,有关算法的更多信息请阅读此处。简而言之:
设图G上DFS的结果是v中节点v上的函数c。c(v)是N\u v的子集,当满足以下两个条件时,它在c(v)中保持v':
注意,对于T的根节点r,c(r)是r的所有子节点的集合。可以在时间O(n m)中计算函数c。
按如下方式计算分隔符对:
# performs DFS on G for some root node r
c = DFS(G,r)
# computes articulation points of G and corresponding number of components
aps = {}
compCounts = {}
for each v in V:
numComps = |c(v)|
if v != r:
++numComps
if numComps > 1:
add v to aps
compCounts[v] = numComps
# computes the set of all separator pairs containing at least on ap
S = {}
for each v in aps:
numComps = compCounts[v]
for each v' in N_v:
if numComps > 2:
# G_{v,v'} has at least two connected components
add {v,v'} to S
else:
# if v' is an isolated node in G_{v}, then G_{v,v'} is connected
if N_v' != {v}:
add {v,v'} to S
# computes remaining separator pairs
for each v in V \ aps:
compute G_{v}
# performs DFS on G_{v} for some root r_v != v
c_v = DFS(G_{v},r_v)
# adds separator pairs for articulation points of G_{v} in N_v
for each v' in N_v:
numComps = |c(v')|
if v' != r_v:
++numComps
if numComps > 1:
add{v,v'} to S
运行时间为O(n*(n m))
非常简单,可能不是最有效的:
设图为G=(V, E),V:={v_1,...,v_n}。对于V的每个子集,G_V是包含节点V\V的节点诱导子图。再让N
按如下方式计算对:
pairs = {}
for each v in V:
compute G_{v}
if G_{v} is unconnected:
for each v' in N>_v:
# Ensures that removal of v' does not render subgraph connected
# (Note comment by MkjG)
if |c(G_{v})| > 2 or {v'} not in c(G_{v}):
add {v,v'} to pairs
else:
for each v' in N>_v:
compute G_{v,v'}
if G_{v,v'} unconnected:
add {v,v'} to pairs
可以在O(m n)中通过DFS或BFS检查连接。因此,运行时应为O(n*k*(m n)),其中k是G的最大阶数。
我正在寻找一个算法,找到顶点的最小子集,这样从图中移除这个子集(以及连接这些顶点的边),所有其他顶点都变得不连通(即,图将没有任何边)。 null 我有图论的基础知识,所以请原谅任何不正确的地方。
问题内容: 在使用Jenkins Docker插件时,可能由于错误而导致无法启动群集。我没有注意,目前有数千个脱机节点无法启动。 底线-是否可以批量删除Jenkin中的节点(从属),清理所有脱机节点甚至删除所有节点?重置Jenkins服务器没有帮助,而且我在Jenkins API中找不到方法。 在我开始编写Selenium脚本之类的东西之前,请感谢任何想法。 非常感谢! 问题答案: 该脚本的注释部
是否有可能在IntelliJ IDE中删除模块中的所有断点(可能正在使用快捷方式)?谢谢
我现在正在读一本关于从二叉搜索树中删除节点的书,书中描述的过程对我来说似乎不必要地复杂。 在1号情况下,如果我们删除40,它将替换为30;在 2 号情况下,如果我们删除 40,它将被替换 35。 但在书中,它说应该从要删除的节点的右子树中找到替换,这可能涉及一些复杂的操作。 我在这里遗漏了什么吗?请指出。
这是史蒂文·斯基纳(StevenSkiena)提出的算法设计问题(用于面试准备): 图G的一个连接点是一个顶点,其删除与G断开。设G是一个有n个顶点和m条边的图。给出一个简单的O(n m),该O(n m)可以为n个顶点找到一个删除顺序,以便没有删除会断开图形。 这就是我的想法: > 在图上运行DFS并不断更新每个节点最古老的可达祖先(我们根据它来决定它是桥切节点、父可爱节点还是根切节点) 如果我们
正如标题所说,我目前正试图找到BST的最大节点,我想删除它。我有方法来查找最大节点和删除节点准备从我的算法书,但我不知道如何在主方法中使用它们。我有一个方法,可以通过输入一个数字插入节点,例如8,这将打印一个级别有序的树:4, 2, 6, 1, 3, 5, 7其中4是根。我希望能够找到最后一个节点并删除它。到目前为止,我有这些方法: 我的主要方法是这样的: 我希望能够自由插入任何节点,并且树仍然能