12. 图--图的遍历

图的遍历

深度优先搜索

Depth First Search,DFS

伪代码

void DFS(Vertex V) {
    visited[V] = true;

    for (V 的每个邻接点 W) {
        if (!visited[W])
            DFS(W);
    }
}

若有N个顶点、E条边,时间复杂度是

  • 用邻接表存储图,为O(N+E)
  • 用邻接矩阵存储图,为O(N2)

广度优先搜索

Breadth First Search, BFS

伪代码

void BFS(Vertex V) {
    visited[V] = true;
    Enqueue(V, Q);

    while (!IsEmpty(Q)) {
        V = Dequeue(Q);
        for (V 的每个邻接点 W) {
            if (!visited[W])
                visited[W] = true;
                Enqueue(W, Q);
            }
        }
    }
}

若有N个顶点、E条边,时间复杂度是

  • 用邻接表存储图,为O(N+E)
  • 用邻接矩阵存储图,为O(N2)

连通图概念

  • 连通:如果从VW 存在一条(无向)路径,则称VW 是连通的
  • 路径:VW 的路径是一系列顶点{V,V1,V2,...,Vn,W} 的集合,其中任一对相邻的顶点间都有图中的边。如果VW 之间所有的顶点都不同,则称简单路径
  • 路径的长度:路径中的边数(如果带权,则是所有边的权重和)
  • 回路:起点等于终点的路径
  • 连通图:图中任意两顶点均连通
  • 连通分量:无向图的极大连通子图
    • 极大顶点数:再加1个顶点就不连通了
    • 极大边数:包含子图中所有顶点相连的所有边
  • 强连通:有向图中顶点VW 之间存在双向路径,则称VW 是强连通的
  • 强连通图:有向图中任意两顶点均强连通
  • 强连通分量:有向图的极大强连通子图

处理图不连通的遍历

之前进行DFS和BFS遍历,只是把V 所在的连通分量遍历了一遍。如果需要遍历到所有顶点,则需要重复调用DFS和BFS

DFS

void ListComponents(Graph G) {
    for (each V is G) {
        if (!visited[V]) {
            DFS(V);
        }
    }
}

BFS

void ListComponents(Graph G) {
    for (each V is G) {
        if (!visited[V]) {
            BFS(V);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章