链接表存储图(C++注释详解): 构建表 深度优先遍历 (DFS)

news2024/11/15 11:33:01
链接表的结构体单元:
#define size 100
typedef struct node {
    int idx;//下一个节点的索引
    int wt;//权重, 也可根据实际情景存储边的信息
    struct node* next;
}Node;
Node* hd[size]; // 存储图的邻接表

链接表的的构建:

int main()
{
    int n, m;
    cin >> n >> m; // 输入节点数和边数
    for (int i = 0; i < n; i++) hd[i] = NULL; // 初始化邻接表为空
    int u, v, wt;//从u到v有一条权值为wt的有向线段
    for(int i = 0; i < m; i++) // 输入边的信息
    {
        cin >> u >> v >> wt;
        Node* t_node = (Node*)malloc(sizeof(Node)); // 创建新节点
        t_node->idx = v; // 设置新节点的索引
        t_node->wt = wt; // 设置新节点的权重
        if (hd[u] == NULL) // 如果之前还没有建立节点
        {
            t_node->next = NULL;
            hd[u] = t_node; // 将新节点设置为邻接表头节点
        }
        else
        {
            t_node->next = hd[u]->next;
            hd[u]->next = t_node; // 将新节点加入邻接表
        }
    }
}

深度(DFS)优先遍历函数

void DFS(int st)
{
    Node* t_node = hd[st]; // 获取起始节点的邻接表头指针
    for (; t_node; t_node = t_node->next) // 遍历邻接表中的节点
    {
        int u = t_node->idx; // 获取相邻节点的索引
        if (!visited[u]) // 如果相邻节点未被访问过
        {
            cout << u << " "; // 输出相邻节点的索引
            visited[u] = true; // 标记相邻节点为已访问
            DFS(u); // 递归访问相邻节点
        }
    }
}

总体代码实现:

#include<bits/stdc++.h>
using namespace std;
#define size 100

typedef struct node {
    int idx;//下一个节点的索引
    int wt;//权重, 也可根据实际情景存储边的信息
    struct node* next;
}Node;
Node* hd[size]; // 存储图的邻接表
bool visited[size]; // 标记节点是否被访问过

void DFS(int st)
{
    Node* t_node = hd[st]; // 获取起始节点的邻接表头指针
    for (; t_node; t_node = t_node->next) // 遍历邻接表中的节点
    {
        int u = t_node->idx; // 获取相邻节点的索引
        if (!visited[u]) // 如果相邻节点未被访问过
        {
            cout << u << " "; // 输出相邻节点的索引
            visited[u] = true; // 标记相邻节点为已访问
            DFS(u); // 递归访问相邻节点
        }
    }
}

int main()
{
    int n, m;
    cin >> n >> m; // 输入节点数和边数
    for (int i = 0; i < n; i++) hd[i] = NULL; // 初始化邻接表为空
    int u, v, wt;
    for(int i = 0; i < m; i++) // 输入边的信息
    {
        cin >> u >> v >> wt;
        Node* t_node = (Node*)malloc(sizeof(Node)); // 创建新节点
        t_node->idx = v; // 设置新节点的索引
        t_node->wt = wt; // 设置新节点的权重
        if (hd[u] == NULL) // 如果之前还没有建立节点
        {
            t_node->next = NULL;
            hd[u] = t_node; // 将新节点设置为邻接表头节点
        }
        else
        {
            t_node->next = hd[u]->next;
            hd[u]->next = t_node; // 将新节点加入邻接表
        }
    }
     // 输入开始节点
    int st;
    cin >> st;
    // 深度优先搜索
    for (int i = 0; i < size; i++)    visited[i] = false; // 初始化visited数组为false
    cout << st << " ";
    visited[st] = true;
    DFS(st);
}

测试数据:

/*
测试数据:
5 6
1 2 4
2 5 10
1 3 5
3 2 1
3 4 2
4 5 6
*/

上述数据对应图例:

~希望对你有帮助~

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

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

相关文章

Win11把应用程序添加到开机自启动中

通过WinR命令打开“运行”&#xff0c;输入shell:startup 进入到如图目录&#xff1a; 将想要自动启动的应用的快捷方式都拷贝进来。 之后在任务管理器中就能发现它了。

ipa 功能包调试,分区算法,覆盖算法测试

参考 wiki 流网络 flow network 解释 相关文章 ipa 分区算法 ipa 分区算法总结&#xff0c;部分算法图解 环境 ubuntu20&#xff0c;ros 版本 noetic 运行测试 按照 readme 提示进行测试&#xff0c;跳过第一个步骤&#xff0c;并不需要 turtlebot3。 执行第三个 launch 报…

Go微服务开源框架kratos的依赖注入关系总结

该文章为学习开源微服务框架kratos的学习笔记&#xff01;官方文档见&#xff1a;简介 | Kratos Kratos 一套轻量级 Go 微服务框架&#xff0c;包含大量微服务相关框架及工具。 一、Kratos 项目结构简介 通过 Kratos 工具生成的 Go工程化项目模板如下&#xff1a; applicati…

界面组件DevExpress Reporting v24.1预览版 - 拥有原生Angular报表查看器

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 下一个主要更新(v24.1)将于6月初发布&#xff…

基于java的超级玛丽游戏的设计与实现(论文 + 源码)

Java的超级玛丽游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313347 基于java的超级玛丽游戏的设计与实现 摘要 近年来&#xff0c;Java作为一种新的编程语言&#xff0c;以其简单性、可移植性和平台无关性等优点&#xff0c;得到了广泛地应用。J2SE称…

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

strcpy函数详解

strcpy函数详解 1.函数简介2.strcpy函数的使用2.1使用方法一2.1使用方法二 3.strcpy在使用过程中的注意事项3.1被复制字符必须以\0结尾3.2目标空间必须能够大于源字符串长度3.3目标空间必须可变 1.函数简介 strcpy函数包含在<string.h>库函数中&#xff0c;是将一个字符…

计算机Java项目|springboot母婴商城系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

GAME101-Lecture07学习

前言 今天主要讲shading&#xff08;着色&#xff09;。在讲着色前&#xff0c;要先讲图形中三角形出现遮挡问题的方法&#xff08;深度缓存或缓冲&#xff09;。 先采样再模糊错误&#xff1a;对信号的频谱进行翻译&#xff08;在这期间会有频谱的混叠&#xff09;&#xff…

Lora训练Windows[笔记]

一. 使用kohya_ss的GUI版本&#xff08;https://github.com/bmaltais/kohya_ss.git&#xff09; 这个版本跟stable-diffusion-webui的界面很像&#xff0c;只不过是训练模型专用而已&#xff0c;打开的端口同样是7860。 1.双击setup.bat,选择1安装好xformers,pytorch等和cuda…

k8s 二进制安装 优化架构之 部署负载均衡,加入master02

目录 一 实验环境 二 部署 CoreDNS 1&#xff0c;所有node加载coredns.tar 镜像 2&#xff0c;在 master01 节点部署 CoreDNS 3&#xff0c; DNS 解析测试 4&#xff0c; 报错分析 5&#xff0c;重新 DNS 解析测试 三 master02 节点部署 1&#xff0…

Python数据分析与数据可视化 概念

考试题型&#xff1a; 一、填空题&#xff08;1分*10&#xff09; 二、程序代码填空&#xff08;1分*20&#xff09; 三、读程序写结果&#xff08;10分*4&#xff09; 四、程序设计&#xff08;10分*1&#xff09; 五、问答题&#xff08;20分*1&#xff09; 考试范围&#x…

【Pytorch】10.CIFAR10模型搭建

CIFAR10模型 是torchvision中官方给出的一个数据集,可以通过 dataset torchvision.datasets.CIFAR10(./data, trainFalse, downloadTrue, transformtorchvision.transforms.ToTensor())来下载到指定文件夹 搭建CIFAR10模型 首先我们先去搜一下CIFAR10 model structure 可以看…

51单片机超声波测距_液位检测_温度检测原理图PCB仿真代码

目录 实物图&#xff1a; PCB ​原理图​ 仿真图 ​编辑 程序 资料下载地址&#xff1a;51单片机超声波测距-液位检测-温度检测原理图PCB仿真代码 主控为stc89c52,通过ds18b20进行温度采集&#xff0c;超声波测距&#xff0c;距离不可以超过1m&#xff0c;通过按键可以设…

揭秘未来工厂核心:智慧大屏引领可视化管理新潮流

在数字化浪潮席卷全球的今天&#xff0c;智慧工厂已不再是科幻小说中的概念&#xff0c;而是成为了现代工业发展的新引擎。 智慧工厂可视化大屏&#xff0c;不仅仅是一块显示屏&#xff0c;更是工厂运行的“大脑”。通过这块屏幕&#xff0c;我们可以实时掌握工厂的每一个角落、…

【Linux进程通信 —— 管道】

Linux进程通信 —— 管道 进程间通信介绍进程间通信的概念进程间通信的目的进程间通信的本质进程间通信的分类 管道什么是管道匿名管道匿名管道的原理pipe用fork来共享管道原理站在文件描述符角度-深度理解管道站在内核角度-管道本质管道读写规则管道的特点管道的四种特殊情况管…

shell脚本之sort,uniq,tr,cut,sphit,paste,ecal与正则表达式

sort命令 uniq命令 tr命令 cut命令 sphit命令 paste命令 ecal命令 正则表达式 sort命令 sort命令---以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序 比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序…

C语言——预处理详解

目录 ​编辑 一、预定义符号 二、#define定义符号&#xff08;常量&#xff09; 三、define定义宏 四、带有副作⽤的宏参数 五、宏替换的规则 六、宏函数的对比 七、#和## 7.1 #运算符 7.2 ##运算符 八、命名约定 九、#undef 十、命令行定义 十一、条件编译 十二…

MP3解码入门(基于libhelix)

主要参考资料: 【Arduino Linux】基于 Helix 解码库实现 MP3 音频播放: https://blog.csdn.net/weixin_42258222/article/details/122640413 libhelix-mp3: https://github.com/ultraembedded/libhelix-mp3/tree/master 目录 一、MP3文件二、MP3 解码库三、libhelix-mp3库3.1 …

苹果新款 M4 芯片专注于 AI

爆炸性消息&#xff01;苹果的新一代 M4 芯片来了&#xff01;这家伙拥有 38 万亿次操作的超强神经引擎&#xff0c;速度比苹果 A11 芯片的 NPU 快 60 倍&#xff01;虽然它的速度还没有达到 Snapdragon X Elite 的 45 TOPS&#xff0c;但苹果自夸 M4 将提供与最新 PC 芯片相同…