C++ 非STL数据结构学习——1.4 图

一般而言,图的实现有邻接矩阵和邻接表两种。


1. 邻接矩阵

#include <iostream>
#include <vector>class Graph {
private:int V; // 顶点数量std::vector<std::vector<int>> adjMatrix; // 邻接矩阵std::vector<bool> visited; // 记录顶点是否被访问过public:Graph(int vertices) : V(vertices) {adjMatrix.resize(V, std::vector<int>(V, 0));visited.resize(V, false);}void addEdge(int u, int v) {// 在顶点u到v之间添加一条有向边adjMatrix[u][v] = 1;}void printGraph() {std::cout << "Graph adjacency matrix:" << std::endl;for (int i = 0; i < V; ++i) {for (int j = 0; j < V; ++j) {std::cout << adjMatrix[i][j] << " ";}std::cout << std::endl;}}//图的深度优先遍历void DFS(int startVertex) {visited[startVertex] = true;std::cout << startVertex << " ";for (int i = 0; i < V; ++i) {if (adjMatrix[startVertex][i] == 1 && !visited[i]) {DFS(i);}}}void DFSTraversal() {std::cout << "Depth First Traversal starting from vertex 0:" << std::endl;DFS(0);std::cout << std::endl;}//图的广度优先遍历void BFS(int startVertex) {std::queue<int> q;q.push(startVertex);visited[startVertex] = true;while (!q.empty()) {int currentVertex = q.front();q.pop();std::cout << currentVertex << " ";for (int i = 0; i < V; ++i) {if (adjMatrix[currentVertex][i] == 1 && !visited[i]) {q.push(i);visited[i] = true;}}}}void BFSTraversal() {std::cout << "Breadth First Traversal starting from vertex 0:" << std::endl;BFS(0);std::cout << std::endl;}
};
};

2. 邻接表

#include <iostream>
#include <vector>class Graph {
private:int V; // 顶点数量std::vector<std::vector<int>> adjList; // 邻接表std::vector<bool> visited; // 记录顶点是否被访问过public:Graph(int vertices) : V(vertices) {adjList.resize(V);visited.resize(V, false);}void addEdge(int u, int v) {// 在顶点u的邻接表中添加顶点vadjList[u].push_back(v);}void printGraph() {std::cout << "Graph adjacency list:" << std::endl;for (int i = 0; i < V; ++i) {std::cout << i << " -> ";for (int j : adjList[i]) {std::cout << j << " ";}std::cout << std::endl;}}//深度优先遍历void DFSRecursive(int startVertex) {visited[startVertex] = true;std::cout << startVertex << " ";for (int neighbor : adjList[startVertex]) {if (!visited[neighbor]) {DFSRecursive(neighbor);}}}// 深度优先遍历入口void DFSTraversal() {std::cout << "Depth First Traversal starting from vertex 0:" << std::endl;DFSRecursive(0);std::cout << std::endl;}// 广度优先搜索void BFS(int startVertex) {std::queue<int> q;q.push(startVertex);visited[startVertex] = true;while (!q.empty()) {int currentVertex = q.front();q.pop();std::cout << currentVertex << " ";for (int neighbor : adjList[currentVertex]) {if (!visited[neighbor]) {q.push(neighbor);visited[neighbor] = true;}}}}// 广度优先搜索入口void BFSTraversal() {std::cout << "Breadth First Traversal starting from vertex 0:" << std::endl;BFS(0);std::cout << std::endl;}
};

P1. 洛谷p3916图的遍历

#include<iostream>
#include<vector>
#include<queue>
using namespace std;class Graph {
private:int V; // 顶点数量std::vector<std::vector<int>> adjList; // 邻接表std::vector<bool> visited; // 记录顶点是否被访问过vector<int> maxspot;//记录每个点能到达的最大点的编号public:Graph(int vertices) : V(vertices) {adjList.resize(V+1);visited.resize(V+1, false);//只用于初始化,不可像fill一样用maxspot.resize(V+1);for(int i=0;i<=V;i++)maxspot[i]=i;//初始化为自己}void addEdge(int u, int v) {// 在顶点u的邻接表中添加顶点vadjList[u].push_back(v);}void clearvis(){for(int i=1;i<=V;i++) visited[i]=false;}void printans(){for(int i=1;i<=V;i++)cout<<maxspot[i]<<" ";}void printGraph() {std::cout << "Graph adjacency list:" << std::endl;for (int i = 1; i < V+1; ++i) {std::cout << i << " -> ";for (int j : adjList[i]) {std::cout << j << " ";}std::cout << std::endl;}}//深度优先遍历void DFSRecursive(int startVertex) {visited[startVertex] = true;std::cout << startVertex << " ";for (int neighbor : adjList[startVertex]) {if (!visited[neighbor]) {DFSRecursive(neighbor);}}}// 深度优先遍历入口void DFSTraversal() {std::cout << "Depth First Traversal starting from vertex 0:" << std::endl;DFSRecursive(0);std::cout << std::endl;}// 广度优先搜索void BFS(int startVertex) {int record=startVertex;std::queue<int> q;q.push(startVertex);visited[startVertex] = true;while (!q.empty()) {int currentVertex = q.front();q.pop();if(currentVertex>maxspot[record]) maxspot[record]=currentVertex;//std::cout << currentVertex << " ";for (int neighbor : adjList[currentVertex]) {if (!visited[neighbor]) {q.push(neighbor);visited[neighbor] = true;}}}//cout<<endl;}// 广度优先搜索入口void BFSTraversal() {std::cout << "Breadth First Traversal starting from vertex 0:" << std::endl;BFS(0);std::cout << std::endl;}
};int main()
{int n,m;cin>>n>>m;Graph mygraph(n);for(int i=1;i<=m;i++){int a,b;cin>>a>>b;mygraph.addEdge(a,b);}//mygraph.printGraph();for(int i=1;i<=n;i++){mygraph.BFS(i);mygraph.clearvis();}mygraph.printans();return 0;
}

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

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

相关文章

逐次逼近型ADC转换器(SAR ADC)的原理与应用

逐次逼近型ADC&#xff08;SAR ADC&#xff0c;Successive Approximation Register Analog-to-Digital Converter&#xff09;是一种广泛应用于模拟信号数字化的模数转换器。它以其高速度、低功耗以及适中的分辨率而著称&#xff0c;特别适合于各种嵌入式系统、传感器接口以及物…

下标记数(一)

第1题 0~5出现次数&#xff08;程序填空&#xff09; 统计出一串0~5数字构成的数列中&#xff0c;6种数字各自出现的次数。 输入格式 第一行1个正整数&#xff1a;N&#xff0c;范围在[1,100]。第二行N个由0~5组成的数列。 输出格式 一行6个整数&#xff0c;分别是0~5出现的…

数据结构--线性表双向链表的实现

目录 思路设计 总体思维导图 插入部分 头插法尾插法 任意位置插入 删除部分 头结点 尾节点 中间节点 只有头结点且删除的就是头结点 ​编辑 清空链表部分 遍历清空链表的所有节点 不遍历清空 各部分代码 Main部分 MyListedList部分 IndexOutOfException部分 …

深入了解卡尔曼滤波:最优状态估计的数学神器

深入了解卡尔曼滤波&#xff1a;最优状态估计的数学神器 卡尔曼滤波是一种递归的状态估计方法&#xff0c;它通过系统模型和测量值来更新状态的最优估计。我们先来了解一下卡尔曼滤波的基本原理。 1. 假设条件 卡尔曼滤波的基本假设如下&#xff1a; 线性动态模型&#xff…

【大模型理论篇】精简循环序列模型(minGRU/minLSTM)性能堪比Transformer以及对循环神经网络的回顾

1. 语言模型之精简RNN结构 近期关注到&#xff0c;Yoshua Bengio发布了一篇论文《Were RNNs All We Needed?》&#xff0c;提出简化版RNN&#xff08;minLSTM和minGRU&#xff09;。该工作的初始缘由&#xff1a;Transformer 在序列长度方面的扩展性限制重新引发了对可在训练期…

IO重定向

文章目录 IO重定向概念3个标准文件描述符“最低可用文件描述符”原则 默认的连接&#xff1a;tty使用close then open将stdin定向到文件使用open..close..dup..close将stdin定向到文件使用open..dup2..close将stdin重定向到文件课上实验 IO重定向 大多数的程序不接收输出文件名…

015 品牌关联分类

文章目录 后端CategoryBrandEntity.javaCategoryBrandController.javaCategoryBrandServiceImpl.javaCategoryServiceImpl.javaBrandServiceImpl.java删除 npm install pubsub-jsnpm install --save pubsub-js这个错误是由于在尝试安装 pubsub-js 时&#xff0c;npm 发现了项目…

计算机毕业设计 基于Python的荣誉证书管理系统的设计与实现 Python毕业设计 Python毕业设计选题 Django框架 Vue【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【自动驾驶】UniAD代码解析

1.参考 论文&#xff1a;https://arxiv.org/pdf/2212.10156 代码&#xff1a;https://github.com/OpenDriveLab/UniAD 2.环境配置 docs/INSTALL.md &#xff08;1&#xff09;虚拟conda环境 conda create -n uniad python3.8 -y conda activate uniad &#xff08;2&#…

哀牢山“禁区”爆改“景区”,双卫星智能终端给驴友多一份保障

在这个国庆假期&#xff0c;以神秘莫测、地势凶险著称的哀牢山走红&#xff0c;一天之内占据了多个微博热搜。但是&#xff0c;哀牢山的美丽背后隐藏着不可小觑的风险。景区方面已发出安全警示&#xff0c;提醒游客勿轻易涉足未知地带和未开发区域&#xff0c;以免发生危险。 …

论文翻译 | Dynamic Prompting: A Unified Framework for Prompt Tuning

摘要 已经证明&#xff0c;在从预训练的基础模型中高效提取知识方面&#xff0c;提示调整&#xff08;prompt tuning&#xff09;技术是非常有效的&#xff0c;这些基础模型包括预训练的语言模型&#xff08;PLMs&#xff09;、视觉预训练模型以及视觉-语言&#xff08;V-L&…

【网络协议大花园】应用层 http协议的使用小技巧,用好了都不用加班,效率翻两倍(下篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

HCIP--以太网交换安全(二)

端口安全 一、端口安全概述 1.1、端口安全概述&#xff1a;端口安全是一种网络设备防护措施&#xff0c;通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理&#xff1a; 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…

[运维]6.github 本地powershell登录及设置ssh连接

当我在本地的git hub 进行修改后&#xff0c;需要推送到远程github仓库。 当我运行了git add . git commit -m "ingress-controller image" 以后&#xff0c;运行git push origin main&#xff0c;发现由于网络原因无法连接到远程github仓库。 此时开始设置ssh连…

数组与集合的应用-数组演练

1、获取一维数组最小值 1.1 实例说明 一维数组常用于保存线性数据&#xff0c;例如数据库中的单行数据就可以使用一维数组保存。本实例接收用户在文本框中输入的单行数据&#xff0c;其中数据都是整数数字&#xff0c;以不同数量的空格分割数字&#xff0c;如图1所示。这个先行…

Spring相关知识补充

目录 一、将Bean存储到spring&#xff08;容器&#xff09;中 1、使用spring-config的方式将对象存储到spring容器中 2、使用类注解的方式将Bean对象存储到容器中 1️⃣、配置扫描路径&#xff08;使用注解的方式存对象的前提&#xff09; 2️⃣、使用五大类注解存储Bean对…

C语言练习

接下来一段时间&#xff0c;博主要参加军训没有时间更新C语言知识点&#xff0c;但博主会每天更新一道C语言的题作为分享。 1.计算并显示整数的差 分析&#xff1a;1.题目并不难&#xff0c;首先我们要知道printf这个库函数&#xff0c;是用来打印数据到屏幕的库函数 2.设置变…

【AI知识点】反向传播(Backpropagation)

反向传播&#xff08;Backpropagation&#xff09; 是训练神经网络的核心算法&#xff0c;它通过反向逐层计算损失函数对每个权重的梯度&#xff0c;来反向逐层更新网络的权重&#xff0c;从而最小化损失函数。 一、反向传播的基本概念 1. 前向传播&#xff08;Forward Propag…

文件丢失一键找回,四大数据恢复免费版工具推荐!

丢失数据的情况虽然不经常出现&#xff0c;但一旦出现都会让人头疼不已&#xff0c;而这时候&#xff0c;要如何恢复丢失的数据呢&#xff1f;一款免费好用的数据恢复工具就派上用场了&#xff01;接下来就为大家推荐几款好用的数据恢复工具&#xff01; 福昕数据恢复 直达链…

Redis list 类型

list类型 类型介绍 列表类型 list 相当于 数组或者顺序表 list内部的编码方式更接近于 双端队列 &#xff0c;支持头插 头删 尾插 尾删。 需要注意的是&#xff0c;Redis的下标支持负数下标。 比如数组大小为5&#xff0c;那么要访问下标为 -2 的值可以理解为访问 5 - 2 3 …