数组模拟邻接表存图

news2024/11/18 21:50:41

图的定义

图(graph)是一种非线性数据结构,由顶点和边组成。我们可以将图 抽象地表示为一组顶点和一组边的集合。G(V,E)
图分为有向图和无向图,下图带箭头为有向图,无箭头为无向图
在这里插入图片描述
我们可以用两种方式来表示图,邻接矩阵和邻接表,我们主要来讲一下邻接表
在这里插入图片描述

代码如下:

#include <iostream>
using namespace std;
#include <vector>

// 定义链表节点结构
struct node
{
    int x; // 节点编号
    int w; // 某个起始点到x的边的权值
    node* next; // 指向下一个节点的指针

    // 节点构造函数
    node(int _x, int _w)
    {
        this->x = _x; // 设置节点编号
        this->w = _w; // 设置边权值
        next = nullptr; // 初始化下一个节点指针为nullptr
    }
};

vector<node*> head; // 创建一个节点指针的向量,表示图的邻接表

// 添加边的函数
void add_edge(int u, int v, int w)
{
    node* a = head[u]; // 获取起始节点u
    node* b = new node(v, w); // 创建一个新节点b,表示边(u, v)及其权值w
    b->next = a->next; // 将b的next指针指向a的下一个节点
    a->next = b; // 将u的下一个节点指针指向b,形成边的连接
}

int main()
{
    int n, m;
    cout << "输入节点数和边数: ";
    cin >> n >> m; // 输入节点数和边数

    head.resize(n + 1); // 调整head的大小以容纳所有节点(节点编号从1到n)
    for (int i = 0; i <= n; i++)
    {
        head[i] = new node(i, 0); // 初始化每个节点
    }

    cout << "输入每条边的信息(格式: 起始节点 结束节点 权值): " << endl;
    for (int i = 0; i < m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w; // 输入每条边的起始节点u、结束节点v和权值w
        add_edge(u, v, w); // 添加边到邻接表中
    }

    // 输出邻接表
    cout << "邻接表: " << endl;
    for (int i = 1; i <= n; i++)
    {
        node* p = head[i]->next; // 从节点i的下一个节点开始遍历
        while (p)
        {
            cout << i << " -> " << p->x << " (权值: " << p->w << ")" << endl; // 输出当前节点及其边的目的节点和权值
            p = p->next; // 移动到下一个节点
        }
    }

    cout << endl;
    return 0;
}

在这里插入图片描述

用数组模拟空间来实现

我们来开四个数组,分别是 edgenextheadweight
在这里插入图片描述

代码如下

#include <iostream>
using namespace std;
#include <vector>

vector<int> head, edge, Next, weight; // 定义4个数组:head存储每个节点的头指针,edge存储边的目标节点,Next存储下一条边的索引,weight存储边的权值

int idx = 0; // 记录边的数量,用于给边编号

// 添加边的函数
void add_edge(int u, int v, int w)
{
    edge[idx] = v; // 设置边的目标节点为v
    weight[idx] = w; // 设置边的权值为w
    Next[idx] = head[u]; // 将当前节点的第一条边设置为u节点之前的第一条边(实现链表连接)
    head[u] = idx++; // 更新u的头指针为当前边,并递增边的计数
}

int main()
{
    int n, m;
    cout << "输入节点数和边数: ";
    cin >> n >> m; // 输入节点数n和边数m

    head.resize(n + 1, -1); // 初始化head数组,大小为n+1(节点编号从1到n),初始值为-1,表示没有边
    edge.resize(m + 1); // 初始化edge数组,大小为m+1
    Next.resize(m + 1); // 初始化Next数组,大小为m+1
    weight.resize(m + 1); // 初始化weight数组,大小为m+1

    cout << "输入每条边的信息(格式: 起始节点 结束节点 权值): " << endl;
    for (int i = 0; i < m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w; // 输入每条边的起始节点u、结束节点v和权值w
        add_edge(u, v, w); // 调用add_edge函数,将边添加到邻接表中
    }

    // 输出邻接表
    cout << "邻接表: " << endl;
    for (int i = 1; i <= n; i++)
    {
        for (int j = head[i]; ~j /*j != -1*/; j = Next[j]) // 遍历与节点i相关的所有边
        {
            int u = i;
            int v = edge[j]; // 获取边的目标节点
            int w = weight[j]; // 获取边的权值
            cout << u << " -> " << v << " (权值: " << w << ")" << endl; // 输出该边
        }
    }

    cout << endl;
    return 0;
}

邻接表,数组模拟邻接表gitee源码

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

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

相关文章

有点快要跟不上时代的感觉

团队的群里面有一个同事突然问了下&#xff0c;下面的这个 JavaScript 如何进行优化 var startIndex (start undefined || start null) ? null : start[0].Value;看上面的代码就是典型的判断和返回的问题。 如果是要调试的话也不是做不出来&#xff0c;但可能要花点时间&a…

【Java】—— 多线程:线程的创建方式3、4___实现Callable与线程池

目录 8.1 新增方式一&#xff1a;实现Callable接口 8.2 新增方式二&#xff1a;使用线程池 8.1 新增方式一&#xff1a;实现Callable接口 与使用Runnable相比&#xff0c; Callable功能更强大些 相比run()方法&#xff0c;可以有返回值 方法可以抛出异常 支持泛型的返回值&…

音视频整体解码流程和同步流程

目录 1. 整体解码流程1. 初始化 FFmpeg2. 打开媒体文件3. 查找解码器4. 打开解码器5. 读取和解码数据6. 处理解码后的帧7. 释放资源 2. 音视频同步整体流程1. 解复用媒体流2. 解码3. 以音频为时钟源进行音视频同步的策略4. 缓冲区设计 现在先说大体流程&#xff0c;不分析代码 …

网络原理 - TCP/IP

文章目录 传输层UDP协议TCP协议TCP协议的核心机制确认应答机制超时重传机制连接管理三次握手四次挥手 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题 异常情况 小结 网络层IP协议IP地址不够用的问题一、动态分配IP地址二、 NAT机制(网络地址映射)三、使用IPv6 地…

【HarmonyOS】自定义圆点进度条

【HarmonyOS】实现一个自定义带圆点的进度条效果。 方案就是做一个圆角组件&#xff0c;然后利用rotate旋转&#xff0c;至于动画效果&#xff0c;我查了一下文档&#xff0c;只要设置enableSmoothEffect:false&#xff0c;就可以关闭动画&#xff0c;然后自己开个定时器&#…

如何使用代理IP解决反爬虫问题

在网络爬虫的世界里&#xff0c;反爬虫机制就像是守卫城池的士兵&#xff0c;时刻准备着抵御外来的“入侵者”。为了突破这些守卫&#xff0c;代理IP就像是你的隐形斗篷&#xff0c;帮助你在网络世界中自由穿梭。今天&#xff0c;我们就来聊聊如何使用代理IP解决反爬虫问题。 …

【CMake】一、CMake 介绍

CMake 基础介绍 1. CMake 介绍2. CMake 安装3. 入门样例 - Hello-world 工程 1. CMake 介绍 CMake 是一个开源、跨平台的构建系统&#xff0c;主要用于软件的构建、测试和打包。 CMake 使用平台无关的配置文件 CMakeLists.txt 来控制软件的编译过程&#xff0c;并生成适用于不…

叉车司机信息权限采集系统,保障与优化叉车运输网络的安全

叉车司机信息权限采集系统可以通过监控司机的行车行为和车辆状况&#xff0c;实时掌握车辆位置和行驶路线&#xff0c;从而提高运输安全性&#xff0c;优化运输网络&#xff0c;降低事故风险。同时&#xff0c;该系统还可以通过对叉车司机信息和行车数据的分析&#xff0c;优化…

LM393 电压比较器和典型电路

一、介绍 LM393内部包括有两个独立、高精度电压比较器 组成的集成电路&#xff0c;失调电压低&#xff0c;最大为2.0mV。专为获得宽电压范围、单电源供电而设计&#xff0c;也可以双电源供电。而且无论电源电压大小&#xff0c;电源消耗的电流都很低。即使是单电源供电&#xf…

数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall

数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall 数据集-目标检测系列-兔子检测数据集 rabbit 数据量&#xff1a;8k 想要进一步了解&#xff0c;请联系。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加…

【重学 MySQL】三十九、Having 的使用

【重学 MySQL】三十九、Having 的使用 基本语法示例示例 1&#xff1a;使用 HAVING 过滤分组示例 2&#xff1a;HAVING 与 WHERE 的结合使用 注意点WHERE 与 HAVING 的对比基本定义与用途主要区别示例对比总结 在 MySQL 中&#xff0c;HAVING 子句主要用于对 GROUP BY 语句产生…

进阶SpringBoot之 Dubbo-admin 安装测试

Dubbo 是一个 jar 包&#xff0c;本身并不是一个服务软件 它能让 Java 程序连接到 Zookeeper&#xff0c;并利用 Zookeeper 消费、提供服务 Dubbo-admin 是一个可视化的监控程序&#xff0c;可以让用户更好的管理监控众多的 Dubbo 服务 GitHub dubbo-admin 在项目目录下打包…

MyBatis<foreach>标签的用法与实践

foreach标签简介 实践 demo1 简单的一个批量更新&#xff0c;这里传入了一个List类型的集合作为参数&#xff0c;拼接到 in 的后面 &#xff0c;来实现一个简单的批量更新 <update id"updateVislxble" parameterType"java.util.List">update model…

代码随想录算法训练营第56天 | 1、冗余连接,2、冗余连接II

目录 1、冗余连接 2、冗余连接II 1、冗余连接 题目描述 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&#xff09;&#xff0c;如图&#xff1a; 现在在…

UNI-SOP应用场景(1)- 纯前端预开发

在平时新项目开发中&#xff0c;前端小伙伴是否有这样的经历&#xff0c;hi&#xff0c;后端小伙伴们&#xff0c;系统啥时候能登录&#xff0c;啥时候能联调了&#xff0c;这是时候往往得到的回答就是&#xff0c;再等等&#xff0c;我们正在搭建系统呢&#xff0c;似曾相识的…

Marp精华总结(一)基础篇

概述 Marp是一个基于MarkDown快速编写幻灯片的工具&#xff0c;其可以基于VScode环境&#xff0c;实现MarkDown幻灯的编写和预览。Marp并不难&#xff0c;但是目前的教程还比较零散&#xff0c;而且很多细节和高级内容并没有完全展示&#xff0c;我自己是很早就体验到了Marp的…

C语言进阶之泛型列表(Generic List)

1.前言 数据结构是需要泛型的,而在C语言中实现泛型就只能去用指针魔法了,来跟我一起实现吧!所有代码经测试未发现明显bug,可放心食用. 2.代码截图展示 1.list.h 2.main.c 3.list.c 3.结语 这次分享的列表采用动态数组的方式实现,下次我会去用链表实现,两种实现方式各有优劣,希…

通信工程学习:什么是VIM虚拟化基础设施管理器

VIM:虚拟化基础设施管理器 VIM(Virtualized Infrastructure Manager)虚拟化基础设施管理器,是一种负责管理和控制虚拟化环境中所有虚拟资源的工具和系统。以下是关于VIM虚拟化基础设施管理器的详细解释: 一、定义与功能 VIM是网络功能虚拟化(NFV)架构中…

DVWA-File Inclusion(文件包含)渗透测试

概念&#xff1a; 漏洞产生原因&#xff1a; 主要是由于开发人员没有对用户输入的文件路径进行严格的过滤和验证。例如&#xff0c;如果一个 Web 应用程序接受用户输入的文件路径&#xff0c;然后使用这个路径进行文件包含&#xff0c;而没有对用户输入进行任何检查&#xff0c…

dll 研究 1

起因&#xff0c; 目的: 就是想看看 dll 里面有什么。 过程: 找到&#xff0c;打开 dumpbin 在开始菜单中搜索 “Developer Command Prompt for VS”打开&#xff0c; 然后输入 dumpbin 查看 a.dll 中 dumpbin /headers a.dll 查看头部信息dumpbin /EXPORTS a.dlldumpbin /a…