图数据结构问题

时间:2011-11-14 00:41:04

标签: algorithm data-structures graph pseudocode

我在为这些问题设计伪代码时遇到了问题。 这不是一个任务问题。 我所知道的就是它们与GRAPH数据结构有关。

  1. 描述一个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
    
  2. 假设n-顶点有向无环图G是紧凑的 如果存在某种方式用G从0到n-1的整数对G的顶点进行编号,使得G包含边(i,j)当且仅当i <1时。 j,对于[0,n-1]中的所有(i,j),给出一个O(n ^ 2)时间算法,用于检测G是否紧凑。

    (同样,我猜这与拓扑排序有关,但我不知道如何实现它。)

  3. 假设连接图G是双连通的,如果它不包含顶点,其去除将G分成2个或更多连通分量。

    给出O(n + m)时算法,用于将至多n个边加到连通图G上,其中n> = 3个顶点和m> =(n-1)个边,以保证G是双连通的。 (可能跨越森林?)。

1 个答案:

答案 0 :(得分:0)

我对这些问题很开心!至少,2和3。

1)     我不确定我是否完全理解,但我想通过“计算连通组件”来表示“构建顶点的子集,使每个子集都是连通的组件”。如果是这样,我认为BFS或DFS会起作用,具体取决于你如何管理内存(即你如何标记你已经访问过的顶点)。

2)     [编辑]这是一个算法,在任何非循环有向图上使用,应根据“紧凑”定义对顶点进行编号,并检测图形是否实际上是紧凑的(即包含所有边缘(i) ,j)使得i

  1. 查找没有传入边的所有顶点(因为图是非循环的,我们知道至少会有其中一个)。 1A。如果有多个,则终止算法:图形不紧凑。
  2. 从可用的最低编号(0,第一次迭代)开始为其分配编号。
  3. 从图表中移除此顶点,以及从中传出的所有边。
  4. 返回步骤1,重复直到所有顶点消失。如果我们在没有算法终止的情况下达到那个点,那么图就是紧凑的。
  5. (这也是O(n ^ 2),btw - n搜索n个顶点以找到没有传入边的顶点 - 尽管这只是最坏的情况) 在这结束时,所有顶点都将被编号,如果它有传入边缘,它们来自的节点将具有比自身更低的数字。

    3)     假设图已经连接,这里有一个算法使它成为双连接的:

    1. 找到只有一条边的所有顶点(即端点)。
    2. 任意选择其中一个。
    3. 将此选定顶点的边绘制到所有其他端点顶点。 (我认为这实际上适合O(n)。一个搜索n个顶点以找到端点,并且我们添加少于n个边,因为你不能有一个完全由端点组成的连通图。)
    4. 瞧!一个双连图!删除任何端点顶点,原始连接图仍然完好无损;删除任何其他顶点,我们知道每个段仍然通过端点连接。