链接表存储图(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 100typedef 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数组为falsecout << 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.xdnf.cn/news/1424477.html

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

相关文章

script标签以及defer和async属性

1. <script>标签 将JavaScript代码嵌入到HTML中主要方式是使用<script>元素。 使用<script>的方式有两种&#xff1a; &#xff08;1&#xff09;直接在网页中嵌入JavaScript代码&#xff1a; <script>function sayHi() {console.log("Hi"…

slugify,slug格式转换工具

目录 前言 安装 特性 基本功能 生成简单的Slug 处理特殊字符 Unicode支持 高级功能 自定义替换规则 过滤停用词 使用不同的分隔符 处理多种语言 实际应用场景 网站和博客的SEO优化 电子商务平台的产品链接 数据清洗和预处理 总结 前言 在Web开发中&#xff0c;生成易于…

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是&#xff0c;登录弹框在另外一个页面中&#xff0c;而当前页面不存在&#xff0c;在当前页面中判断如果token不存在&#xff0c;就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录&#xff0c;则执行后续操作(注意此处&#xff0c;可不要)

汇聚荣:拼多多长期没有流量如何提高?

在电商的海洋中&#xff0c;拼多多以其独特的团购模式吸引了众多消费者的目光。然而&#xff0c;随着市场竞争的加剧和消费者需求的多样化&#xff0c;一些商家发现自家店铺的流量持续低迷&#xff0c;销售业绩难以突破。面对这样的挑战&#xff0c;如何有效提升拼多多店铺的客…

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

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

思科模拟器--2.静态路由和默认路由配置24.5.15

首先&#xff0c;创建三个路由器和两个个人电脑。 接着&#xff0c;配置两台电脑的IP&#xff0c;子网掩码和默认网关 对Router 0&#xff0c;进行以下命令&#xff1a; 对Router进行以下命令&#xff1a; 对Router2进行以下命令&#xff1a; 本实验完成。 验证&#xff1a;PC…

基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录 介绍开始架构图样例一定义工厂定义具体工厂&#xff08;上衣、下装&#xff09;定义产品定义具体生产产品&#xff08;上衣、下装&#xff09; 测试样例 总结优点缺点与抽象工厂不同点 介绍 在 Factory Method模式中&#xff0c;父类决定实例的生成方式&#xff0c;但…

AutoNeRF:Training Implicit Scene Representations with Autonomous Agents

论文概述 《AutoNeRF》是由Pierre Marza等人撰写的一篇研究论文&#xff0c;旨在通过自主智能体收集数据来训练隐式场景表示&#xff08;如神经辐射场&#xff0c;NeRF&#xff09;。传统的NeRF训练通常需要人为的数据收集&#xff0c;而AutoNeRF则提出了一种使用自主智能体高效…

Yalmip使用教程(8)-常见报错及调试方法

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍使用yalmip工具箱编程过程中的常见错误和相应的解决办法。 1.optimize的输出参数 众所周知&#xff0c;optimize是yalmip用来求…

Tomcat无法连通的调试方法1-service方式无法连通

作者&#xff1a;私语茶馆 1.局域网Tomcat服务不通 组网如下&#xff1a; 问题&#xff1a; Tomcat Server 服务方式启动后&#xff0c;无法访问&#xff0c;但命令行方式启动可以。IP地址都在同网段或不同网段现象都一样。 2.Tomcat 服务安装与调试 在Windows下&#xff0c;…

Cadence 16.6 绘制PCB封装时总是卡死的解决方法

Cadence 16.6 绘制PCB封装时总是卡死的解决方法 在用Cadence 16.6 PCB Editor绘制PCB封装时候&#xff0c;绘制一步卡死一步&#xff0c;不知道怎么回事儿&#xff0c;在咨询公司IT后&#xff0c;发现是WIN系统自带输入法的某些热键与PCB Editor有冲突&#xff0c;导致卡死。 …

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 拼数字

//bfs只能过40%。 #include<bits/stdc.h> using namespace std; #define int long long int a,b,c,dp[2028]; struct s {int x,y,z;string m; }; map<vector<int>,int>k; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a…

[链表专题]力扣141, 142

1. 力扣141 : 环形链表 题 : 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

git 基础

【一】介绍 &#xff08;1&#xff09;软件开发模式 瀑布式开发 线性、顺序的开发流程&#xff0c;严格按照需求分析、设计、编码、测试、交付等阶段进行。每个阶段都必须在前一个阶段完成后才能开始&#xff0c;因此开发周期长&#xff0c;难以应对需求变更。适用于需求明确…

2024网上可申请离婚,无需对方同意!

&#x1f383;很多客户决定离婚之后却因为不了解离婚流程没准备好所需材料&#xff0c;导致离婚失败&#xff0c;或者无故被对方e意拖延&#xff0c;无计可施&#xff0c;无可奈何&#xff01; &#x1f383;别怕&#xff0c;2024年离婚新规定已发布&#xff0c;离婚变的简单了…

利用管道通信(pipe)测量进程间的上下文切换(context switch)开销

利用管道通信(pipe)测量进程间的上下文切换(context switch)开销 《https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-mechanisms.pdf》 Measuring the cost of a context switch is a little trickier. The lmbench benchmark does so by running two processes on a single CPU…

山东大学计算机考研数据分析,初复试占比6:4,复试内容不少得花精力准备!

山东大学&#xff08;ShandongUniversity&#xff09;&#xff0c;简称山大&#xff0c;位于中国山东&#xff0c;是中华人民共和国教育部直属的综合性全国重点大学&#xff0c;是国家“211工程”、“985工程”重点建设院校&#xff0c;入选“111计划”、“珠峰计划”、“卓越工…

kafka用java收发消息

用java客户端代码来对kafka收发消息 具体代码如下 package com.cool.interesting.kafka;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; i…

基于springboot+vue+Mysql的大学生社团活动平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…