C++_有向图的邻接表及邻接矩阵表示

有向图:

1. **定义**:有向图是一种图,其中边是有方向的。每条边连接两个顶点,其中一个是起点,另一个是终点。在有向图中,从一个顶点到另一个顶点的边具有方向,因此不能双向移动。

2. **特性**:
   - 边是有方向的,从一个顶点到另一个顶点有一定的方向性。
   - 有向图中的边可以用箭头表示,箭头指向终点。
   - 有向图中可能存在环,即顶点之间形成循环路径。
   - 有向图的度可以分为入度和出度,入度是指指向该顶点的边的数量,出度是指从该顶点出发的边的数量。

3. **表示方法**:
   - 邻接表:对于每个顶点,存储其指向的其他顶点列表。
   - 邻接矩阵:用二维数组表示顶点之间的连接关系,其中1表示有边相连,0表示没有边相连。

4. **应用场景**:
   - 网络路由:路由器之间的连接可以用有向图表示,每个路由器是一个顶点,路由器之间的连接是有向边。
   - 社交网络:用户之间的关注关系可以用有向图表示,每个用户是一个顶点,关注关系是有向边。
   - 流程图:流程中的各个步骤之间的顺序关系可以用有向图表示,每个步骤是一个顶点,步骤之间的执行顺序是有向边。

有向图在各种领域都有广泛的应用,用于建模和解决各种问题。

  •  有向图的邻接表表示
#include <iostream>
#include <vector>
#include <list>

using namespace std;

// 有向图的邻接表表示
class Graph {
private:
    int V; // 顶点数
    vector<list<int>> adjList; // 邻接表

public:
    // 在构造函数中对类的成员变量进行初始化,过 : V(vertices) 这样的语法,将参数 vertices 的值赋给了类成员变量 V
    Graph(int vertices) : V(vertices) {  
        adjList.resize(V);
    }

    // 添加边
    void addEdge(int src, int dest) {
        adjList[src].push_back(dest);
    }

    // 打印图
    void printGraph() {
        for (int i = 0; i < V; ++i) {
            cout << "顶点" << i << "邻接点: ";
            for (auto it = adjList[i].begin(); it != adjList[i].end(); ++it) {
                cout << *it << " ";
            }
            cout << endl;
        }
    }
};

int main() {
    Graph g(5);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 3);
    g.addEdge(2, 4);
    g.addEdge(3, 4);
    g.addEdge(4, 1);

    g.printGraph();

    return 0;
}
  •  有向图的邻接矩阵表示
#include <iostream>
#include <vector>

using namespace std;

// 有向图的邻接矩阵表示
class Graph {
private:
    int V; // 顶点数
    vector<vector<int>> adjMatrix;  adjMatrix:表示邻接矩阵的整数二维向量。 

public:
    Graph(int vertices) : V(vertices) {
        adjMatrix.resize(V, vector<int>(V, 0)); // 初始化为0
    }

    // 添加边
    void addEdge(int src, int dest) {
        adjMatrix[src][dest] = 1;
    }

    // 打印图
    void printGraph() {
        for (int i = 0; i < V; ++i) {
            cout << "顶点 " << i << " 的邻接顶点: ";
            for (int j = 0; j < V; ++j) {
                if (adjMatrix[i][j] == 1) {
                    cout << j << " ";
                }
            }
            cout << endl;
        }
    }

        // 打印邻接矩阵
    void printAdjMatrix() {
        cout << "邻接矩阵:" << endl;
        for (int i = 0; i < V; ++i) {
            for (int j = 0; j < V; ++j) {
                cout << adjMatrix[i][j] << " ";
            }
            cout << endl;
        }
    }

};

int main() {
    Graph g(5);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 3);
    g.addEdge(2, 4);
    g.addEdge(3, 4);
    g.addEdge(4, 1);

    g.printGraph();
    g.printAdjMatrix();

    return 0;
}
// Graph 类:
// Graph 类使用邻接矩阵表示有向图。
// 私有成员:
// V:表示图中顶点数的整数。
// adjMatrix:表示邻接矩阵的整数二维向量。
// 公有方法:
// 构造函数:构造函数以顶点数为参数,并初始化邻接矩阵,将所有元素设置为 0。
// addEdge:通过将邻接矩阵中相应元素设置为 1,从顶点 src 添加到顶点 dest 的有向边。
// printGraph:打印图的邻接表表示,显示顶点及其相邻顶点。
// printAdjMatrix:打印图的邻接矩阵表示。

    // 邻接表表示
    vector<vector<int>> adjList;
    // 邻接矩阵表示
    vector<vector<int>> adjMatrix;

// 使用邻接表和邻接矩阵表示有向图的C++代码
#include <iostream>
#include <vector>

using namespace std;

// 打印图的邻接矩阵表示的函数
void printAdjMatrix(const vector<vector<int>>& adjMatrix) {
    for (const auto& row : adjMatrix) {
        for (int val : row) {
            cout << val << " ";
        }
        cout << endl;
    }
}

// 表示边的结构体
struct Edge {
    int src, dest;
};

class Graph {
public:
    // 初始化有向图的构造函数
    Graph(const vector<Edge>& edges, int N) : adjList(N), adjMatrix(N, vector<int>(N, 0)) {
        // 向有向图中添加边
        for (const auto& edge : edges) {
            adjList[edge.src].push_back(edge.dest);
            adjMatrix[edge.src][edge.dest] = 1;
        }
    }

    // 打印图的邻接表表示的函数
    void printAdjList() {
        for (size_t i = 0; i < adjList.size(); ++i) {
            cout << "顶点 " << i << " 连接到:";
            for (const auto& v : adjList[i]) {
                cout << " -> " << v;
            }
            cout << endl;
        }
    }

    // 打印图的邻接矩阵表示的函数
    void printAdjMatrix() {
        for (const auto& row : adjMatrix) {
            for (int val : row) {
                cout << val << " ";
            }
            cout << endl;
        }
    }

private:
    // 邻接表表示
    vector<vector<int>> adjList;

    // 邻接矩阵表示
    vector<vector<int>> adjMatrix;
};

int main() {
    // 有向图中的边列表
    vector<Edge> edges = {{0, 1}, {1, 2}, {2, 0}, {2, 1}, {3, 2}, {4, 5}, {5, 4}};

    // 有向图中的顶点数量
    int N = 6;

    // 构造有向图
    Graph graph(edges, N);

    // 打印有向图的邻接表表示
    cout << "邻接表:" << endl;
    graph.printAdjList();

    // 打印有向图的邻接矩阵表示
    cout << "\n邻接矩阵:" << endl;
    graph.printAdjMatrix();

    return 0;
}

 ------------

在 C++ 中,std::vector<std::vector<int>> 是一个非常灵活和强大的数据结构,它实质上表示一个动态的二维数组或表格。这种数据结构是由标准模板库(STL)中的 std::vector 容器嵌套构成的,每个内部 vector 可以独立地改变大小,这提供了很多传统静态二维数组所不具备的特性和优势。下面是 std::vector<std::vector<int>> 能表示的一些主要内容:

1. 不规则的二维数组

不同于传统的二维数组必须有固定的行和列大小,std::vector<std::vector<int>> 允许每一行的长度可以不同,这使得它可以用来表示不规则的数据结构,如三角形或其他更复杂的结构。

2. 动态大小的表格

因为 std::vector 的大小是可以动态改变的,所以使用 std::vector<std::vector<int>> 可以在运行时添加或删除行和列,适合于数据量未知或需要动态调整大小的情况。

3. 易于扩展的数据集

此结构非常适合处理数据集,特别是当你不确定数据集的维度或在程序运行时可能需要扩展数据集的情况。它为添加、删除和修改数据提供了便捷的方式。

4. 表格或矩阵操作

在需要执行表格或矩阵运算(如数学计算、统计分析)的应用中,std::vector<std::vector<int>> 可以用来存储矩阵数据,并进行动态的行列操作。但需要注意的是,对于复杂的数学运算,可能需要实现或使用额外的库来处理矩阵运算。

5. 图的邻接矩阵

在图论中,邻接矩阵是表示图的顶点如何连接的一种方式。使用 std::vector<std::vector<int>>,可以灵活地表示和修改图的结构,尤其是对于动态变化的图结构。

6. 作为数据容器

这种数据结构可以用来存储任何需要二维数组形式的数据,如游戏棋盘、电子表格数据、图像数据等。

7. 数据库结果集

在从数据库查询返回的数据经常是表格式的,std::vector<std::vector<int>> 可以用来存储查询结果,尤其是当结果集的大小不是事先知道的时候。

总之,std::vector<std::vector<int>> 提供了很高的灵活性和动态性,使得它在很多需要使用表格、矩阵或其他形式的二维数据集的应用场景中非常有用。然而,需要注意的是,与单一的 std::vector 相比,嵌套的 vector 在内存使用和管理上可能更复杂,也可能影响性能,特别是在大规模数据处理时。

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

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

相关文章

llama_index微调BGE模型

微调模型是为了让模型在特殊领域表现良好,帮助其学习到专业术语等。 本文采用llama_index框架微调BGE模型,跑通整个流程,并学习模型微调的方法。 一、环境准备 Linux环境,GPU L20 48G,Python3.8.10。 pip该库即可。 二、数据准备 该框架实现了读取各种类型的文件,给…

C++学习第十六课:宏与模板的基础讲解示例

C学习第十六课&#xff1a;宏与模板的深度解析 宏和模板是C中两个强大的特性&#xff0c;它们都允许编写灵活且通用的代码。宏通过预处理器实现&#xff0c;而模板则是C的编译时特性。本课将深入探讨宏的定义、使用以及潜在的问题&#xff0c;以及模板的基本使用、特化、偏特化…

LeetCode 110.平衡二叉树(Java/C/Python3/Go实现含注释说明,Easy)

标签 树深度优先搜索递归 题目描述 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡的二叉树定义为&#xff1a; 一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。 原题&#xff1a;LeetCode 110.平衡二叉树 思路及…

羽毛多肽复合纳米纤维膜

羽毛多肽复合纳米纤维膜是一种结合了羽毛多肽和其他纳米纤维材料&#xff08;如P(MA-AA)等&#xff09;的新型生物材料。这种复合纳米纤维膜通过引入羽毛多肽&#xff0c;进一步提升了其生物相容性、生物活性以及吸附性能。 羽毛多肽作为一种天然生物材料&#xff0c;具有良好的…

Centos7+Hadoop3.3.4+KDC1.15+Ranger2.4.0集成

一、集群规划 本次测试采用3台虚拟机&#xff0c;操作系统版本为centos7.6。 kerberos采用默认YUM源安装&#xff0c;版本为&#xff1a;1.15.1-55 Ranger版本为2.4.0 系统用户为ranger:ranger IP地址主机名KDCRanger192.168.121.101node101.cc.localKDC masterRanger Admin…

Spring6 当中的 Bean 循环依赖的详细处理方案+源码解析

1. Spring6 当中的 Bean 循环依赖的详细处理方案源码解析 文章目录 1. Spring6 当中的 Bean 循环依赖的详细处理方案源码解析每博一文案1.1 Bean的循环依赖1.2 singletion 下的 set 注入下的 Bean 的循环依赖1.3 prototype下的 set 注入下的 Bean 的循环依赖1.4 singleton下的构…

MouseBoost PRO for Mac激活版:强大的 鼠标增强软件

在追求高效工作的今天&#xff0c;MouseBoost PRO for Mac成为了许多Mac用户的得力助手。这款功能强大的鼠标增强软件&#xff0c;以其独特的智能化功能和丰富的实用工具&#xff0c;让您的电脑操作更加便捷、高效。 MouseBoost PRO for Macv3.4.0中文激活版下载 MouseBoost PR…

Hotcoin Research | 市场洞察:2024年4月22日-28日

加密货币市场表现 本周内加密大盘整体呈现出复苏状态&#xff0c;在BTC减半后进入到震荡上行周期。BTC在$62000-66000徘徊&#xff0c;ETH在$3100-3300徘徊&#xff0c;随着港交所将于 4 月 30 日开始交易嘉实基金的比特币和以太坊现货 ETF&#xff0c;周末行情有一波小的拉升…

帮助 Python 用户构建 CLI 界面:直观易写、简单高效 | 开源日报 No.240

tiangolo/typer Stars: 13.7k License: MIT typer 是一个构建出色命令行界面&#xff08;CLI&#xff09;的库&#xff0c;基于 Python 类型提示。它旨在让开发者轻松创建用户喜欢使用的 CLI 应用程序。其主要功能和核心优势包括&#xff1a; 直观易写&#xff1a;强大编辑器…

vue3 jspdf,element table 导出excel、pdf,横板竖版分页

多个表格需要&#xff0c;pdf需要的格式与原本展示的表格样式不同 1.创建一个新的表格&#xff0c;设置pdf需要的样式&#xff0c;用vue的h函数放入dom中 2.excel用xlxs插件直接传入新建el-table的dom,直接导出 3.pdf导出类似excel黑色边框白底黑字的文件&#xff0c;把el-t…

FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流

OBS是一个开源的直播录制软件&#xff0c;英文全称叫做Open Broadcaster Software&#xff0c;广泛用于视频录制、实时直播等领域。OBS不但开源&#xff0c;而且跨平台&#xff0c;兼容Windows、Mac OS、Linux等操作系统。 OBS的官网是https://obsproject.com/&#xff0c;录制…

STM32利用硬件I2C读取MPU6050陀螺仪数据

有了前面的基本配置&#xff0c;这节读取MPU6050的数据还算是简单&#xff0c;主要就是初始化时给MPU6050一些配置&#xff0c;取消睡眠模式&#xff0c;MPU6050开机是默认睡眠模式的&#xff0c;读写无效&#xff0c;所以上来就要先更改配置&#xff1a; MPU6050寄存器初始化…

mongodb卸载(win)

关闭服务 &#xff08;或者cmd卸载服务&#xff1a;&#xff09; net stop 服务名称卸载应用 至此&#xff0c;卸载完成&#xff01;

微隔离实施五步法,让安全防护转起来

前言 零信任的最核心原则→最小权限 安全的第一性原理→预防 零信任的最佳实践→微隔离 “零信任”这个术语的正式出现&#xff0c;公认是在2010年由Forrester分析师John Kindervag最早提出。时至今日&#xff0c;“零信任”俨然已成安全领域最热门的词汇&#xff0c;做安全…

实验报告5-Spring MVC实现页面

实验报告5-SpringMVC实现页面 一、需求分析 使用Spring MVC框架&#xff0c;从视图、控制器和模型三方面实验动态页面。模拟实现用户登录&#xff0c;模拟的用户名密码以模型属性方式存放在Spring容器中&#xff0c;控制器相应用户请求并映射参数&#xff0c;页面收集用户数据或…

设计模式-01 设计模式单例模式

设计模式-01 设计模式单例模式 目录 设计模式-01 设计模式单例模式 1定义 2.内涵 3.使用示例 4.具体代码使用实践 5.注意事项 6.最佳实践 7.总结 1 定义 单例模式是一种设计模式&#xff0c;它确保一个类只能被实例化一次。它通过在类内部创建类的唯一实例并提供一个全…

uniapp + uView动态表单校验

项目需求&#xff1a;动态循环表单&#xff0c;并实现动态表单校验 页面&#xff1a; <u--form label-position"top" :model"tmForm" ref"tmForm" label-width"0px" :rulesrules><div v-for"(element, index) in tmForm…

(详细整理!!!!)Tensorflow与Keras、Python版本对应关系!!!

小伙伴们大家好&#xff0c;不知道大家有没有被tensorflow框架困扰过 今天我就给大家整理一下tensorflow和keras、python版本的对应关系 大家这些都可以在官网找到&#xff0c;下面我把官网的连接给大家放在这里&#xff1a;在 Windows 环境中从源代码构建 | TensorFlow (g…

搭建大型分布式服务(三十七)SpringBoot 整合多个kafka数据源-取消限定符

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

基于 React 的图形验证码插件

react-captcha-code NPM 地址 &#xff1a; react-captcha-code - npm npm install react-captcha-code --save 如下我自己的封装&#xff1a; import Captcha from "react-captcha-code";type CaptchaType {captchaChange: (captchaInfo: string) > void;code…
最新文章