前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Day22-图算法-图的深搜和宽搜

Day22-图算法-图的深搜和宽搜

作者头像
BUPTrenyi
发布于 2019-07-15 09:03:32
发布于 2019-07-15 09:03:32
81800
代码可运行
举报
运行总次数:0
代码可运行

一 唠嗑

更两篇文章着实有点累,今天偷个懒~

今天先更一下图算法的基础知识-宽搜和深搜

二 问题来了

Q:给定一个图,给出图的深度优先搜索和宽度优先搜索结果。

三 讲一讲

图有邻接矩阵和邻接表两种表示方法,我在下面写的是邻接表。

概念解释

深度优先搜索:

从图中某个顶点V出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发,深度优先搜索遍历图,直至图中所有和V有路径相通,且未被访问的顶点,都被访问到。若此时还有其他顶点未被访问到,就选一个未被访问的顶点,重复上述过程。

宽度优先搜索:(类似于二叉树的层次遍历,利用队列)

从图中某个顶点V出发,在访问了V之后,依次访问V的各个未被访问的邻接点,然后分别从这些邻接点出发,依次访问他们的邻接点。并保证,先被访问的顶点的邻接点,要先于,后被访问的顶点的邻接点被访问。直至图中已被访问的顶点的邻接点,全被访问到。若此时还有其他顶点未被访问到,就选一个未被访问的顶点,重复上述过程。

四 完整代码及注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
// Created by renyi on 2019-07-10.
//
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

//图的顶点的数据结构
struct GraphNode{
    int value;
    vector<GraphNode*> neighbors;//相邻节点指针数组
    GraphNode(int v) : value(v) {};
};

//图的深度优先搜索
void depthFirstSearch(GraphNode* root, int visit[]){
    visit[root->value] = 1;//标记已经访问的图的顶点
    printf("%d ", root->value);
    for (int i = 0; i < root->neighbors.size(); i++) {//遍历该顶点相邻的,且未被访问的顶点
        if (visit[root->neighbors[i]->value] != 1){
            depthFirstSearch(root->neighbors[i], visit);
        }
    }
}

//图的宽度优先搜索
void breadthFirstSearch(GraphNode* root, int visit[]){
    queue<GraphNode*> q;
    q.push(root);
    visit[root->value] = 1;

    while (!q.empty()){
        GraphNode* node = q.front();
        q.pop();
        printf("%d ", node->value);
        for (int i = 0; i < node->neighbors.size(); i++) {
            if (visit[node->neighbors[i]->value] != 1){
                q.push(node->neighbors[i]);
                visit[node->neighbors[i]->value] = 1;
            }
        }
    }
}

int main(){
    const int maxN = 5;
    GraphNode* graph[maxN];//建立一个数组graph,存储图的各个顶点
    for (int i = 0; i < maxN; i++) {
        graph[i] = new GraphNode(i);
    }
    //有了5个顶点之后,开始按照配图连接边
    graph[0]->neighbors.push_back(graph[4]);
    graph[0]->neighbors.push_back(graph[2]);
    graph[1]->neighbors.push_back(graph[0]);
    graph[1]->neighbors.push_back(graph[2]);
    graph[2]->neighbors.push_back(graph[3]);
    graph[3]->neighbors.push_back(graph[4]);
    graph[4]->neighbors.push_back(graph[3]);

    int depthVisit[maxN] = {0};//建立数组,标记各个顶点是否被访问
    printf("深度优先搜索的结果是:\n");
    for (int i = 0; i < maxN; i++) {
        if (depthVisit[i] == 0){
            printf("第%d次加入的节点是: %d\n", i, graph[i]->value);
            printf("加入后遍历的结果是:\n");
            depthFirstSearch(graph[i], depthVisit);
            printf("\n");
        }
    }

    int breadthVisit[maxN] = {0};
    printf("宽度优先搜索的结果是:\n");
    for (int i = 0; i < maxN; i++) {
        if (breadthVisit[i] == 0){
            printf("第%d次加入的节点是: %d\n", i, graph[i]->value);
            printf("加入后遍历的结果是:\n");
            breadthFirstSearch(graph[i], breadthVisit);
            printf("\n");
        }
    }
    return 0;
}

运行结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法其实很好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法和数据结构: 十二 无向图相关算法基础
从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记。
yaphetsfang
2020/07/30
6120
算法和数据结构: 十二 无向图相关算法基础
文心一言 VS 讯飞星火 VS chatgpt (321)-- 算法导论22.3 13题
十二、证明:我们可以在无向图G上使用深度优先搜索来获得图G的连通分量,并且深度优先森林所包含的树的棵数与G的连通分量数量相同。更准确地说,请给出如何修改深度优先搜索来让其给每个结点赋予一个介于1和k之间的整数值v.cc,这里k是G的连通分量数,使得u.cc=v.cc当且仅当结点u和结点v处于同一个连通分量中。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
930
文心一言 VS 讯飞星火 VS chatgpt (321)-- 算法导论22.3 13题
文心一言 VS 讯飞星火 VS chatgpt (314)-- 算法导论22.3 6题
六、证明:在无向图中,根据深度优先搜索算法是先探索(u,v)还是先探索(v,u)来将边(u,v)分类为树边或者后向边,与根据分类列表中的4种类型的次序进行分类是等价的。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
780
文心一言 VS 讯飞星火 VS chatgpt (314)-- 算法导论22.3 6题
图(Graph)是由顶点的有穷非空集合和 顶点之间边 的集合组成,通常表示为: (Graph) G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 图分无向图与有向图,根据图的边长,又分带权图与不带权图。
小飞侠xp
2018/08/29
2690
(Graph)图,挑着看看
这个数据结构很繁琐,说实话我不喜欢。但是不学吧,总觉得我在数据结构这一块有个大漏洞。 在网上各处搜罗,看了大家对于面试会问到的有关图的内容,想了想,就先整理那部分吧。
看、未来
2020/08/26
4510
(Graph)图,挑着看看
TypeScript 实战算法系列(七):实现图的遍历
有一个图,我们想访问它的所有顶点,就称为图的遍历。遍历图有两种方法:广度优先搜索和深度优先搜索。 图遍历可以用来寻找特定的顶点或寻找两个顶点之间的路径,检查图是否连通。本文将详解图的两种遍历并用TypeScript将其实现,欢迎各位感兴趣的开发者阅读本文。
一只图雀
2020/09/02
9430
【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构
本系列文章【数据结构与算法】所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接
@零一
2021/01/29
5600
文心一言 VS 讯飞星火 VS chatgpt (315)-- 算法导论22.3 7题
七、请重写DFS算法的伪代码,以便使用栈来消除递归调用。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
1010
文心一言 VS 讯飞星火 VS chatgpt (315)-- 算法导论22.3 7题
【数据结构实验】图(三)图的深度优先搜索(DFS)生成树
  深度优先搜索(DFS)是图算法中的一种重要的遍历方法,它通过深度遍历图的顶点来构建生成树。生成树是一个无回路的连通子图,包含了原图的所有顶点,但是边数最少。
Qomolangma
2024/07/30
4530
【数据结构实验】图(三)图的深度优先搜索(DFS)生成树
文心一言 VS 讯飞星火 VS chatgpt (313)-- 算法导论22.3 4题
四、证明:使用单个位来存放每个结点的颜色已经足够。这一点可以通过证明如下事实来得到:如果将DFS-VISIT的第8行删除,DFS给出的结果相同。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
1100
文心一言 VS 讯飞星火 VS chatgpt (313)-- 算法导论22.3 4题
文心一言 VS 讯飞星火 VS chatgpt (317)-- 算法导论22.3 9题
九、请给出如下猜想的一个反例:如果有向图G包含一条从结点u到结点v的路径,则任何对图G的深度优先搜索都将导致v.d⩽u.f。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
970
文心一言 VS 讯飞星火 VS chatgpt (317)-- 算法导论22.3 9题
图的周游
图的周游:是一种按某种方式系统地访问图中的所有节点的过程,它使每个节点都被访问且只访问一次。图的周游也称图的遍历。
恋喵大鲤鱼
2018/08/03
5290
图的周游
图计算中的图遍历是什么?请解释其作用和常用方法。
图遍历是指在图数据结构中按照一定的规则遍历图中的顶点和边的过程。图遍历的作用是通过遍历图中的顶点和边来获取图的结构信息,如查找特定的顶点或边、计算最短路径、判断图的连通性等。常用的图遍历方法包括深度优先搜索(DFS)和广度优先搜索(BFS)。
GeekLiHua
2025/01/21
1010
数据结构-图结构
图Graph是由顶点(图中的节点被称为图的顶点)的非空有限集合V与边的集合E(顶点之间的关系)构成的。 若图G中的每一条边都没有方向,则称G为无向图。 若图G中的每一条边都有方向,则称G为有向图。
WuShF
2023/07/08
4070
数据结构-图结构
文心一言 VS 讯飞星火 VS chatgpt (318)-- 算法导论22.3 10题
十、修改深度优先搜索的伪代码,让其打印出有向图G的每条边及其分类。并指出,如果图G是无向图,要进行何种修改才能达到相同的效果。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
1040
文心一言 VS 讯飞星火 VS chatgpt (318)-- 算法导论22.3 10题
算法|深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说算法|深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现[通俗易懂],希望能够帮助大家进步!!!
Java架构师必看
2022/02/08
1.6K0
算法|深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现[通俗易懂]
深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)
深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为:
zhangjiqun
2024/12/14
5720
深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)
深度优先生成树及其应用
在上一篇博客判断有向图是否有圈中从递归的角度简单感性的介绍了如何修改深度优先搜索来判断一个有向图是否有圈。事实上, 它的实质是利用了深度优先生成树(depth-first spanning tree)的性质。那么什么是深度优先生成树?顾名思义,这颗树由深度优先搜索而生成的,由于无向图与有向图的深度优先生成树有差别,下面将分别介绍。 一. 无向图的深度优先生成树 无向图的深度优先生成树的生成步骤: 深度优先搜索第一个被访问的顶点为该树的根结点。 对于顶点v,其相邻的边w如果未被访问,则边(v, w)为该树的树
llhthinker
2018/01/24
2.1K0
地图导航的幕后英雄:图论如何改变出行?—全程动画可视化数据结构算法之图算法题目试炼
盛透侧视攻城狮
2025/03/24
960
地图导航的幕后英雄:图论如何改变出行?—全程动画可视化数据结构算法之图算法题目试炼
算法基础学习笔记——⑩DFS与BFS\树与图
命运之光
2024/03/20
1240
算法基础学习笔记——⑩DFS与BFS\树与图
推荐阅读
相关推荐
算法和数据结构: 十二 无向图相关算法基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档