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)

连通图概念

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

处理图不连通的遍历

之前进行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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值