在我开始之前,是的,这是一个功课。 如果我在过去的14个小时内没有尽力解决这个问题并且无处可去,我就不会在这里发布。
问题如下: 我想检查是否可以在连接的无向图中删除边,而不是在O(V)时间内断开它,而不仅仅是线性的。
到目前为止我所做的事情:
可以在不断开图形的情况下删除循环边缘,因此我只需检查图形是否有循环。 我有两种方法可以使用,一种是DFS,然后检查我是否有后边缘;另一种是通过计算Vs和Es并检查是否| E | = | V | - 1,如果那是真的那么图是一棵树,我们可以删除没有节点而不断开它。
之前的两种方法都解决了这个问题,但两者都需要O(| E | + | V |),书中说有更快的方法(这可能是一种贪婪的方法)。
我可以得到任何提示吗?
编辑: 更具体地说,这是我的问题;给定一个连通图G =(V,E),我可以删除E中的一些边e并使结果图仍然连接吗?
答案 0 :(得分:8)
图形的任何递归遍历,在访问过程中标记节点,如果遇到已经标记的节点,则短路返回true将会起作用。如果没有可以删除的边缘,则需要O(| V |)遍历整个图形,如果它提前停止返回true,则需要更少的时间。
修改强>
是的,对整个图形的重复遍历需要O(| V | + | E |)时间,但是如果没有循环,我们只遍历整个图形 - 在这种情况下| E | = | V | -1,只需要O(| V |)时间。如果有一个循环,我们将在遍历最多| V |之后找到它边(最多访问| V | +1个节点),同样需要O(| V |)时间。
此外,显然当从节点(第一个节点除外)进行遍历时,您不会考虑用于到达节点的边缘,因为这会导致您立即看到已访问过的节点。
答案 1 :(得分:0)
从我正在阅读的内容来看,没有重复的DFS被认为是O(| V |),所以如果你取边e,让它连接的两个顶点是u和v,如果你从你运行DFS,忽略e如果发现v,你可以推测e不是桥,并且假设没有重复的DFS是O(| V |),那么我想这将被认为是O(| V |)。
答案 2 :(得分:0)
列出所有边E并取一条边并逐一标记所访问的两个端点。如果在遍历过程中我们发现某些边先前已经访问过两个顶点,我们可以删除该边。
我们必须最多采用边缘| V |时间看这个条件是否满足。
最糟糕的情况可能是这样,每次我们采取边缘它将访问至少新的顶点。然后有| V |顶点,我们必须采取| V |找到特定边缘的边缘。
最佳情况可能是| V | / 2 + 1 e