编写程序对给定的有向图(不一定连通)进行深度优先遍历_【数据结构图(二)】图的遍历...

一、深度优先搜索(Depth First Search, DFS)

/* 邻接表存储的图 - DFS */void Visit( Vertex V ){    printf("正在访问顶点%d\n", V);} /* Visited[]为全局变量,已经初始化为false */void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ){   /* 以V为出发点对邻接表存储的图Graph进行DFS搜索 */    PtrToAdjVNode W;         Visit( V ); /* 访问第V个顶点 */    Visited[V] = true; /* 标记V已访问 */     for( W=Graph->G[V].FirstEdge; W; W=W->Next ) /* 对V的每个邻接点W->AdjV */        if ( !Visited[W->AdjV] )    /* 若W->AdjV未被访问 */            DFS( Graph, W->AdjV, Visit );    /* 则递归访问之 */}

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

  • 用邻接表存储图,有O(N+E)

  • 用邻接矩阵存储图,有O(N^2)

二、广度优先搜索(Breadth First Search, BFS)

/* 邻接矩阵存储的图 - BFS */ /* IsEdge(Graph, V, W)检查是否图Graph中的一条边,即W是否V的邻接点。*//* 此函数根据图的不同类型要做不同的实现,关键取决于对不存在的边的表示方法。*//* 例如对有权图, 如果不存在的边被初始化为INFINITY, 则函数实现如下:         */bool IsEdge( MGraph Graph, Vertex V, Vertex W ){    return Graph->G[V][W]true : } /* Visited[]为全局变量,已经初始化为false */void BFS ( MGraph Graph, Vertex S, void (*Visit)(Vertex) ){   /* 以S为出发点对邻接矩阵存储的图Graph进行BFS搜索 */    Queue Q;         Vertex V, W;     Q = CreateQueue( MaxSize ); /* 创建空队列, MaxSize为外部定义的常数 */    /* 访问顶点S:此处可根据具体访问需要改写 */    Visit( S );    Visited[S] = true; /* 标记S已访问 */    AddQ(Q, S); /* S入队列 */         while ( !IsEmpty(Q) ) {        V = DeleteQ(Q);  /* 弹出V */        for( W=0; WNv; W++ ) /* 对图中的每个顶点W */            /* 若W是V的邻接点并且未访问过 */            if ( !Visited[W] && IsEdge(Graph, V, W) ) {                /* 访问顶点W */                Visit( W );                Visited[W] = true; /* 标记W已访问 */                AddQ(Q, W); /* W入队列 */            }    }}

三、连通

  • 连通:如果从V到W存在一条(无向) 路径,则称V和W是连通的

  • 路径:V到W的路径是一系列顶点{V, v1, v2, …,vn, W}的集合,其中任一对相邻的顶点间都有图中的边。路径的长度是路径中的边数(如果带权,则是所有边的权重和)。如果V到W之间的所有顶点都不同,则称简单路径。

  • 回路:起点等于终点的路径

  • 连通图:图中任意两顶点均连通

  • 连通分量:无向图的极大连通子图

    • 极大顶点数:再加1个顶点就不连通了

    • 极大边数:包含子图中所有顶点相连的所有边

660bf0d3f7efa4da25242f7cca1a1d17.png

  • 强连通:有向图中顶点V和W之间存在双向路径,则称V和W是强连通的

  • 强连通图:有向图中任意两顶点均强连通

  • 强连通分量:有向图的极大强连通子图

b8b41a6da91596b29f4d1d0d3171c005.png

    每调用一次DFS(V),就把V所在的连通分量遍历了一遍。BFS也是一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值