我在为这些问题设计伪代码时遇到了问题。 这不是一个任务问题。 我所知道的就是它们与GRAPH数据结构有关。
描述一个O(n+m)-time
算法,用于计算具有n个顶点和m个边的无向图G
的所有连通分量。
(我猜这与遍历广度优先搜索(BFS)有关,但如果我错了,请纠正我。)。
Input Graph G
Output sequence of connected vertices with edges
List = empty list
for all u in G.vertices
setLabel(u, UNEXPLORED)
for all e in G.edges
setLabel(e, UNEXPLORED)
For all v in G.vertices
if getLabel(v) = UNEXPLORED
BFS (G,v,List)
BFS(G,s,List)
Object A = vertex1, vertex2, edge
L0 = new empty sequence
L0.addLast(s)
setLabel(s,VISITED)
i=0
while Li is not Empty
L(i+1) = new empty sequence
for all v in L(i).elements
for all incidentEdges(v)
if getLabel(e) = UNEXPLORED
w = opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e,DISCOVERY)
setLabel(w,VISITED)
setVertex1(A,v)
setVertex2(A,w)
setEdge(A,e)
List.addLast(A)
L(i+1).addLast(w)
else
setLabel(e,CROSS)
i = i + 1
假设n-顶点有向无环图G是紧凑的 如果存在某种方式用G从0到n-1的整数对G的顶点进行编号,使得G包含边(i,j)当且仅当i <1时。 j,对于[0,n-1]中的所有(i,j),给出一个O(n ^ 2)时间算法,用于检测G是否紧凑。
(同样,我猜这与拓扑排序有关,但我不知道如何实现它。)
假设连接图G是双连通的,如果它不包含顶点,其去除将G分成2个或更多连通分量。
给出O(n + m)时算法,用于将至多n个边加到连通图G上,其中n> = 3个顶点和m> =(n-1)个边,以保证G是双连通的。 (可能跨越森林?)。
答案 0 :(得分:0)
我对这些问题很开心!至少,2和3。
1) 我不确定我是否完全理解,但我想通过“计算连通组件”来表示“构建顶点的子集,使每个子集都是连通的组件”。如果是这样,我认为BFS或DFS会起作用,具体取决于你如何管理内存(即你如何标记你已经访问过的顶点)。
2)
[编辑]这是一个算法,在任何非循环有向图上使用,应根据“紧凑”定义对顶点进行编号,并检测图形是否实际上是紧凑的(即包含所有边缘(i) ,j)使得i (这也是O(n ^ 2),btw - n搜索n个顶点以找到没有传入边的顶点 - 尽管这只是最坏的情况)
在这结束时,所有顶点都将被编号,如果它有传入边缘,它们来自的节点将具有比自身更低的数字。 3)
假设图已经连接,这里有一个算法使它成为双连接的: 瞧!一个双连图!删除任何端点顶点,原始连接图仍然完好无损;删除任何其他顶点,我们知道每个段仍然通过端点连接。