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

链接表的结构体单元:
#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
*/

上述数据对应图例:

~希望对你有帮助~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SOLIDWORKS 2024零件特征功能增强

如大家所知&#xff0c;达索系统SOLIDWORKS每年都会发布新版本以主动响应客户的需求。现有客户使用的版本并不一样&#xff0c;所以在文档数据交流方面存在一定困难。同时工厂中的其它部门都会与产品研发部门进行协作&#xff0c;所以我们需要更强大的软件功能快速接收和处理模…

AnyMP4 Video Converter for Mac/Win - 视频转换的卓越之选

在当今数字化的时代&#xff0c;视频内容无处不在&#xff0c;而拥有一款强大的视频转换器就显得至关重要。AnyMP4 Video Converter for Mac/win 正是这样一款出类拔萃的工具&#xff0c;为您带来高效、便捷的视频转换体验。 这款视频转换器具备令人惊叹的功能。它支持广泛的视…

Shell之(数组)

目录 一、shell数组 1.数组的定义 2.定义数组的方法 第一种 第二种 第三种 第四种 3.数组分片 4. 数组字符替换 临时替换 永久替换 5.删除数组 删除指定的下标 删除整组 6.数组遍历和重新定义 7.数组追加元素 方式一&#xff1a;指定位置添加 方法二&a…

React: memo

React.memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。 const MemoizedComponent memo(SomeComponent, arePropsEqual?)React 通常在其父组件重新渲染时重新渲染一个组件。你可以使用 memo 创建一个组件&#xff0c;当它的父组件重新渲染时&#xff0c;只要它的新…

阅读一些精华(老文献)

本文设置的初衷是诺贝尔化学奖得主Sir Fraser Stoddart说过&#xff1a;我们不能局限于最近几年的工作&#xff0c;而要往几十年前看&#xff0c;说不定因为之前的一些技术原因&#xff0c;导致当初的方法没有实现&#xff0c;现在可以实现了。 1.Variable-Rate Transmission f…

垃圾分类管理系统java项目

文章目录 垃圾分类管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 垃圾分类管理系统 一、项目演示 垃圾分类管理系统 二、项目介绍 系统角色&#xff1a;管理员、用户 1、登录、注册功能…

服务器之间实现免密码传输文件(scp免密传输)

问题&#xff1a;需要定时将本服务器的文件传输到指定服务器上作为备份 通过scp实现不同服务器之间的文件传输 正常使用scp传输文件 传输文件命令&#xff1a;scp /data/文件 root服务器地址&#xff1a;/指定目录 传输文件夹命令&#xff1a;scp -r /data/文件 root服务…

Unity与Andriod的交互

Unity与安卓的信息交互 这次分享的不同于传统的方式AndroidJavaClass("com.unity3d.player.UnityPlayer") 如果是新手的话&#xff0c;请看 交互新手教程 这里讲的是在Unity中调用java代码&#xff0c;或者在unity中传参到java中&#xff0c;在Java代码中运行。 以下…

css画三角形

使用border div {border-top: 50px solid yellowgreen;border-bottom: 50px solid deeppink;border-left: 50px solid bisque;border-right: 50px solid chocolate; }如果想要单个的三角形&#xff0c;把其它三边的颜色设为transparent即可 使用 conic-gradient 绘制三角形 …

ADS FEM 仿真设置

1、EM Simulator 选择FEM。 2、在layout界面打开的EM功能&#xff0c;这里不需要操作。 3、Partitioning 不需要操作。 4、没有叠层的话需要新建&#xff0c;过孔可以在叠层处右键添加。 5、端口需要设置GND layer。 6、设置仿真频率。 7、Output plan。 8、Options 设置 介质…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势&#xff0c;其市场价值不仅体现在竞赛本身&#xff0c;还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目&#xff0c;包括竞速赛、技巧赛、航拍赛等。每个项目…

LeetCode494:目标和

题目描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之…

GPT-4o:全面深入了解 OpenAI 的 GPT-4o

GPT-4o&#xff1a;全面深入了解 OpenAI 的 GPT-4o 关于 GPT-4o 的所有信息ChatGPT 增强的用户体验改进的多语言和音频功能GPT-4o 优于 Whisper-v3M3Exam 基准测试中的表现 GPT-4o 的起源追踪语言模型的演变GPT 谱系&#xff1a;人工智能语言的开拓者多模式飞跃&#xff1a;超越…

优秀博士学位论文分享:复杂场景下高精度有向目标检测的研究

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平&#xff0c;本公众号近期将推出“优秀博士学位论文分享”系列文章&#xff0c;对人工智能领域2023年优秀博士学位论文进行介绍和分享&#xff0c;方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…

牛客热题:二叉树与双向链表

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;二叉树与双向链表题目链接方法一…

【LInux】<基础IO> 文件操作 | 文件描述符 | 重定向

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【easyX】动手轻松掌握easyX 1

01 简单绘图 在这个程序中&#xff0c;我们先初始化绘图窗口。其次&#xff0c;简单绘制两条线。 #include <graphics.h>//绘图库头文件 #include <stdio.h> int main() {initgraph(640, 480);//初始化640✖480绘图屏幕line(200, 240, 440, 240);//画线(200,240)…

NAT技术总结与双向NAT配置案例

NAT的转换方式&#xff1a; 1.静态转换&#xff1a;固定的一对一IP地址映射。 interface GigabitEthernet0/0/1 ip address 122.1.2.24 nat static global 122.1.2.1 inside 192.168.1.1 #在路由器出接口 公网地址 私网地址。 2.动态转换&#xff1a;Basic NAT nat address-gr…

centos7下使用docker安装fastdfs服务

先查看容器是否已经存在 docker ps -a 删除掉之前的tracker及storage服务 docker rm tracker docker rm storage 1、没有镜像先下载镜像 docker pull morunchang/fastdfs 2、运行服务 a、不指定物理服务器路径 docker run -d --name tracker --nethost morunchang/fastdfs sh…

【Linux】系统登录,调用shell,shell配置文件,shell命令,特殊符号,shell快捷键,Linux运行级别,解决无限登录问题,修改提示符

目录 Linux系统的登录方式 以及 调用shell Linux shell 以及 shell配置文件 shell 命令 shell 特殊符号 shell 快捷键 Linux操作系统运行级别 单用户模式下解决无限登录问题 centos7修改命令行提示符 PS1 补充、centos7没有滚动条 Linux系统的登录方式 以及 调用shell…