数据结构(6_3_1)——图的广度优先遍历

news2024/11/17 1:38:38

树和图的广度优先遍历区别

 树的广度优先遍历:

图的广度优先遍历: 

代码:

 注:以下代码只适合连通图

#include <stdio.h>
#include <stdbool.h>

#define MAX_VERTEX_NUM 100

typedef struct ArcNode {
    int adjvex; // 该边所指向的顶点的位置
    struct ArcNode* nextarc; // 指向下一条边的指针
} ArcNode;

typedef struct VNode {
    char data; // 顶点信息
    ArcNode* firstarc; // 指向第一条边的指针
} VNode, AdjList[MAX_VERTEX_NUM];

typedef struct {
    AdjList vertices;
    int vexnum, arcnum; // 图的顶点数和边数
} ALGraph;

bool visited[MAX_VERTEX_NUM]; // 访问标记数组

// 访问顶点的函数
void visit(int v) {
    printf("%d ", v);
}

// 判断队列是否为空
bool isEmpty(int front, int rear) {
    return front == rear;
}

// 入队操作
void EnQueue(int* queue, int rear, int v) {
    queue[rear++] = v;
}

// 出队操作
void DeQueue(int* queue, int* front, int* v) {
    *v = queue[(*front)++];
}

// 返回顶点v的第一个邻接点
int FirstNeighbor(ALGraph* G, int v) {
    if (G->vertices[v].firstarc) {
        return G->vertices[v].firstarc->adjvex;
    }
    return -1;
}

// 返回顶点v相对于w的下一个邻接点
int NextNeighbor(ALGraph* G, int v, int w) {
    ArcNode* p = G->vertices[v].firstarc;
    while (p && p->adjvex != w) {
        p = p->nextarc;
    }
    if (p && p->nextarc) {
        return p->nextarc->adjvex;
    }
    return -1;
}

// 广度优先遍历
void BFS(ALGraph* G, int v) {
    int queue[MAX_VERTEX_NUM]; // 辅助队列
    int front = 0, rear = 0; // 队列的头尾指针
    int w;

    visit(v); // 访问初始顶点v
    visited[v] = true; // 对v做已访问标记
    EnQueue(queue, rear, v); // 顶点v入队列

    while (!isEmpty(front, rear)) {
        DeQueue(queue, &front, &v); // 顶点v出队列
        for (w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w)) {
            // 检查v所有邻接点
            if (!visited[w]) { // w为v的尚未访问的邻接点
                visit(w); // 访问顶点w
                visited[w] = true; // 对w做已访问标记
                EnQueue(queue, rear, w); // 顶点w入队列
            }
        }
    }
}

// 主函数,用于演示
int main() {
    // 假设图G已经被正确初始化
    ALGraph G;
    // ... 初始化图G ...

    // 初始化访问标记数组
    for (int i = 0; i < G.vexnum; ++i) {
        visited[i] = false;
    }

    // 从顶点0开始进行广度优先遍历
    BFS(&G, 0);

    return 0;
}
练习:

遍历序列的可变性 

BFS算法(优化版可遍历非连通图) 

代码:

 

bool visited[MAX_VERTEX_NUM];//访问标记数组

void BFSTraverse(Graph G) {//对图G进行广度优先遍历
    for (i = 0; i < G.vexnum; ++i)
        visited[i] = false;//访问标记数组初始化
    InitQueue(Q);//初始化辅助队列Q
    for (i = 0; i < G.vexnum; ++i)//从0号顶点开始遍历
        if (!visited[i])//对每个连通分量调用一次BFS
            BFS(G, i);//vi未访问过,从vi开始BFS

}
//广度优先遍历
void BFS(Graph G, int v) {//从顶点v出发,广度优先遍历图G
    visit(v);//访问初始顶点v
    visited[v] = true;//对v做已访问标记
    Enqueue(Q, v);//顶点v入队列Q
    while (!isEmpty(Q)) {
        DeQueue(Q, v);//顶点v出队列
        for(w=FirsitNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w);)
            //检查v所有邻接点
            if (!visited[w]) {//w为v的尚未访问的邻接点
                visit(w);//访问顶点w
                visited[w] = true;//等于w做已访问标记
                EnQueue(Q, W);//顶点w入队列
            }
    }
}

结论:对于无向图,调用BFS函数的次数=连通分量数

复杂度分析

空间复杂度:

时间复杂度:

 广度优先生成树

 

广度优先生成森林 

练习:有向图的BFS过程

 

总结 :

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2066669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

慧灵夹爪:工业智能的创新先锋

慧灵作为一个知名老品牌&#xff0c;其机器人产品在众多场景中广为人知。随着智能化、自动化技术的不断提升&#xff0c;智能工业飞速发展&#xff0c;慧灵夹爪在其中发挥的作用也越来越多。 在工业自动化生产中&#xff0c;精准与灵活是衡量设备性能的重要标尺。慧灵夹爪以其卓…

Criteria 是干什么用的?

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;热爱技术的小郑。回复 Java全套视频教程 或 前端全套视频…

简易电压表设计验证

前言 电压表是测量电压的一种仪器。由永磁体、线圈等构成。电压表是个相当大的电阻器&#xff0c;理想的认为是断路。初中阶段实验室常用的电压表量程为0~3V和0~15V。 传统的指针式电压表包括一个灵敏电流计&#xff0c;在灵敏电流计里面有一个永磁体&#xff0c;在电流计的两个…

GenAI 的产品:快速行动,但失败

2022 年秋季&#xff0c;我正在做一个很酷的项目。是的&#xff0c;你猜对了——使用公司特定的数据对预先训练的 LLM&#xff08;Bert&#xff09;进行微调。 然而&#xff0c;很快 ChatGPT 就发布了&#xff0c;并席卷了全世界。既然已经有一门非常强大的 LLM 了&#xff0c…

支持AI智能搜索的知识库管理系统有哪些?分享4个软件

引言 在数字化时代&#xff0c;知识的获取、管理和利用已成为企业竞争力的重要组成部分。随着信息量的爆炸性增长&#xff0c;如何快速、准确地从海量数据中检索出有价值的知识&#xff0c;成为企业面临的一大挑战。支持AI智能搜索的知识库管理系统能够快速准确地检索信息&…

【前端】vue监视属性和计算属性对比

首先分开讲解各个属性的作用。 1.计算属性 作用&#xff1a;用来计算出来一个值&#xff0c;这个值调用的时候不需要加括号&#xff0c;会根据依赖进行缓存&#xff0c;依赖不变&#xff0c;computed的值不会重新计算。 const vm new Vue({el:#root,data:{lastName:张,firstNa…

严重腰椎滑脱、无法走路,江山邦尔骨科医院机器人辅助手术为患者完美复位

8月8日上午&#xff0c;53岁的李清&#xff08;化名&#xff09;扶着腰、跛脚走进江山邦尔骨科医院。接诊他的&#xff0c;是江山邦尔骨科医院脊柱科的林科院长。 李清和林院长说&#xff0c;自己已有长达两年的腰痛史&#xff0c;最近还伴随右腿麻木及跛行的症状&#xff0c;严…

深度解析上海我店 三年突破一百亿销售额!

在当今数字化时代的大潮中&#xff0c;消费模式正经历着翻天覆地的变革。上海我店网络科技有限公司&#xff08;简称“我店”&#xff09;&#xff0c;凭借其创新的“互联网实体终端”融合商业模式与独特的绿色积分体系&#xff0c;在消费市场中异军突起&#xff0c;成为引领行…

ClkLog常见问题-埋点集成篇Sec. 1

本篇主要解答ClkLog使用过程中【埋点集成】阶段的常见问题。 1.【指标项数据统计】 问&#xff1a;数据概览无法看到数据。 答&#xff1a;如果数据概览所有指标项都没有数据&#xff0c;则需要先检查埋点数据是否接收成功&#xff1b;如果只是会话相关数据&#xff08;访问次数…

缺陷检测之Anomalib

缺陷检测的现状 工业缺陷数据有一个比较显著的特征&#xff1a;样本不平衡。绝大部分采集得到的工业数据都是没有缺陷的&#xff0c;这样一来&#xff0c;正样本的数据在模型训练中根本没有起到作用&#xff0c;负样本又太少&#xff0c;很难训练得到有效的模型。使用有监督学…

六西格玛与5S管理体系并行落地,实现生产事件精益管理

在现代制造业中&#xff0c;六西格玛管理和5S管理体系是提升生产效率和质量控制的重要工具。六西格玛以其严格的数据分析方法帮助企业减少过程中的变异和缺陷&#xff0c;而5S管理则通过优化工作环境和流程&#xff0c;确保生产线的整洁、有序和高效。如何将这两大管理体系成功…

wpf livechart 绘制笛卡尔曲线

先上图&#xff1a; 代码部分&#xff1a; <GroupBox Header"各生产线生产量趋势"><Grid><Grid.RowDefinitions><RowDefinition Height"45"/><RowDefinition Height"auto"/><RowDefinition/></Grid.RowD…

第R1周: RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是RNN RNN&#xff08;Recurrent Neural Network&#xff09;是一种特殊的神经网络&#xff0c;它能够处理序列数据&#xff0c;如时间序列、文本序列…

MedGraphRAG:医学版 GraphRAG

MedGraphRAG&#xff1a;医学版 GraphRAG 提出我的解法思路 MedGraphRAG 大纲解法大纲 解法拆解U-retrieve 双向检索 分析性关联图创意视角MedGraphRAG 对比 传统知识图谱大模型现在医疗知识图谱的问题MedGraphRAG的三层层级图结构&#xff0c;能不能让普通的医疗知识图谱&…

线程——函数式创建线程threading模块,继承式创建线程,Lock对象解决多线程不安全问题,线程模型中的生产者消费者模式

调度程序内的多任务使用多进程&#xff0c;调度一个进程内的多任务使用多线程 函数式创建线程的方式threading模块 在Python中&#xff0c;创建线程主要依赖于threading模块。 使用threading模块中的Thread类&#xff0c;你可以很容易地基于函数模式创建线程。基本步骤包括&…

Linux | 文件描述符fd详解及重定向技术的应用

多谢梅花&#xff0c;伴我微吟。 - 《高阳台除夜》(韩疁) 2024.8.23 目录 1、文件描述符fd 文件操作符概念(简单带过) 重点&#xff1a;如何理解文件操作符使得系统实现了设备无关性&#xff1f;&#xff08;使得操作系统无需关心具体的硬件细节&#xff09; 示例代码:标准输入…

SAP BW:QUERY数据结果写入ADSO

作者 idan lian 如需转载备注出处 如果对你有帮助&#xff0c;请点赞收藏~~~ 需求背景 客户基于QUERY进行报表展示&#xff0c;现需迁移到永洪报表平台&#xff0c;query中的变量参数&#xff0c;公式等无法直接生成视图&#xff0c;query相对复杂&#xff0c;不想直接在视图…

流动会场:便捷、经济与声学效果的理想融合—轻空间

在现代活动策划中&#xff0c;选择合适的场地至关重要。流动会场作为一种新型移动空间&#xff0c;不仅具备便捷性和高性价比&#xff0c;还以其优异的声学效果&#xff0c;成为各类会议、展览、演出等活动的理想选择。 便捷安装&#xff0c;快速搭建 流动会场的模块化设计使其…

P-One如何测试一个场景集包含多个接口

P-One是泽众软件自主研发的一站式性能测试平台&#xff0c;集管理、设计、压测、监控以及分析于一体的全方位性能测试解决方案&#xff0c;适用于各种非功能测试场景&#xff1a;压力测试、负载测试、稳定性测试、可靠性测试、容量测试等。 在实际业务场景中&#xff0c;如电商…

springsecurity 在web中如何获取用户信息(后端/前端)

一、SecurityContextHolder 是什么 是一个安全的上下文对象&#xff0c;用于获取经过身份验证的用户。 二、SecurityContextHolder 是何时被创建的 当我们经过表单UsernamePasswordAuthenticationFilter 过滤器后&#xff0c;会回调父类的AbstractAuthenticationProcessingFilt…