C++详细讲解图论的基础与图的储存

C++详细讲解图论的基础与图的储存

简介

图是计算机科学中的一种数据结构,广泛用于网络、社交媒体、计算机程序等领域。本文将详细讲解关于图的基础知识以及如何在C++中实现图的储存。

图的基础概念

图是由节点(顶点)和边构成的一种数据结构。可以用图来描述任何二元关系,如夫妻、朋友等等。图可以分为有向图和无向图两种。

  • 无向图:顶点之间的边没有方向,也就是没有从A到B的方向限制。
  • 有向图:边有方向,分为起点和终点。

在图中,每个节点可能有与之相连的多条边。如果两个节点之间有直接的联系,那么它们就是相邻的节点。从一个节点到另一个节点的路径称为通路。

图的储存方式

通常有以下两种方式来储存图:

  • 邻接矩阵
  • 邻接表

邻接矩阵

邻接矩阵使用二维数组来表示图,其中第i行第j列表示节点i到节点j的边是否存在。如果存在则为1,否则为0。

示例:

假设有一个有向图,有4个节点分别为A、B、C、D,边分别为A->B、A->C、B->D、C->D。用邻接矩阵储存的结果如下:

  A  B  C  D
A 0  1  1  0
B 0  0  0  1
C 0  0  0  1
D 0  0  0  0

邻接表

邻接表使用数组和链表来表示图。每个节点的数组中存储指向其相邻节点链表的指针或索引。

示例:

假设有一个无向图,有4个节点分别为A、B、C、D,边分别为A<->B、A<->C、B<->D、C<->D。用邻接表储存的结果如下:

A --> B --> C
B --> A --> D
C --> A --> D
D --> B --> C

C++实现图的储存

邻接矩阵

以下代码展示了如何在C++中使用邻接矩阵来储存图,并且实现了一个简单的深度优先搜索算法:

const int MAXN = 100; //最大节点数,可以根据需要修改

int g[MAXN][MAXN]; //邻接矩阵
bool visited[MAXN]; //记录已访问过的节点

void dfs(int u) { //深度优先搜索算法
    visited[u] = true;
    for(int v=0;v<MAXN;v++) {
        if(g[u][v] && !visited[v]) {
            dfs(v);
        }
    }
}

int main() {
    int n = 4; //节点数
    int m = 4; //边数
    memset(g,0,sizeof(g)); //初始化邻接矩阵
    memset(visited,false,sizeof(visited)); //初始化visited
    //添加边
    g[0][1] = 1;
    g[0][2] = 1;
    g[1][3] = 1;
    g[2][3] = 1;
    dfs(0); //从起点0开始进行深度优先搜索
    return 0;
}

邻接表

以下代码展示了如何在C++中使用邻接表来储存图,并且实现了一个简单的广度优先搜索算法:

const int MAXN = 100; //最大节点数,可以根据需要修改

struct Edge { //边链表节点
    int to;
    int next;
} edge[MAXN*2]; //注意要乘以2,因为无向图中每条边都有两个节点

int head[MAXN]; //储存每个节点的第一条边在edge中的位置
bool visited[MAXN]; //记录已访问过的节点

void bfs(int u) { //广度优先搜索算法
    queue<int> q;
    visited[u] = true;
    q.push(u);
    while(!q.empty()) {
        int v = q.front();
        q.pop();
        for(int i=head[v];i!=-1;i=edge[i].next) {
            int w = edge[i].to;
            if(!visited[w]) {
                visited[w] = true;
                q.push(w);
            }
        }
    }
}

int main() {
    int n = 4; //节点数
    int m = 4; //边数
    memset(head,-1,sizeof(head)); //初始化head
    memset(visited,false,sizeof(visited)); //初始化visited
    int idx = 0; //记录在edge中的位置
    //添加边
    edge[idx].to = 1;
    edge[idx].next = head[0];
    head[0] = idx++;
    edge[idx].to = 2;
    edge[idx].next = head[0];
    head[0] = idx++;
    edge[idx].to = 3;
    edge[idx].next = head[1];
    head[1] = idx++;
    edge[idx].to = 3;
    edge[idx].next = head[2];
    head[2] = idx++;
    bfs(0); //从起点0开始进行广度优先搜索
    return 0;
}

上面两段代码分别实现了邻接矩阵和邻接表的储存方式并且实现了图的遍历算法。通过对代码的运行和调试,可以深入理解C++中储存图的两种方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++详细讲解图论的基础与图的储存 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 详解C++构造函数

    下面是“详解C++构造函数”的完整攻略: 什么是构造函数 在 C++ 中,构造函数是一种特殊的函数,用于在对象创建时初始化对象的数据成员。它的名字和类名相同,没有返回值,没有 void 关键字,可以有参数,也可以没有参数。构造函数的目的是确保每次对象创建时都能正确地初始化数据成员。 构造函数的分类 默认构造函数 如果一个类没有定义构造函数,那么编译器会自动为…

    other 2023年6月26日
    00
  • foxmail邮箱如何设置邮件优先级?foxmail设置邮件优先级教程

    Foxmail邮箱如何设置邮件优先级 1. 打开Foxmail邮箱设置界面 首先,打开Foxmail邮箱。点击顶部菜单栏中的“工具”,然后选择“选项”。 2. 进入邮件设置 在弹出的选项窗口中,选择“邮箱”选项卡。在该选项卡下,可以进行一系列的邮件相关设置。 3. 设置邮件优先级 在邮件设置界面中,找到“发送邮件时设置优先级”一栏。通过下拉菜单,选择你想要的…

    other 2023年6月28日
    00
  • 深入理解js函数的作用域与this指向

    深入理解JS函数的作用域与this指向攻略 1. 作用域(Scope)的概念 作用域是指在程序中定义变量的区域,它决定了变量的可见性和生命周期。在JavaScript中,作用域分为全局作用域和局部作用域。 全局作用域 全局作用域是指在整个程序中都可以访问的变量。在浏览器环境中,全局作用域通常是指在全局对象window下定义的变量。 示例1:全局作用域 var…

    other 2023年8月19日
    00
  • linux lsof命令详解及实例

    Linux lsof命令详解及实例 命令简介 lsof(list open files)命令是一个列出当前系统打开文件的工具。在Linux系统中,所有内容都以文件的形式表示,因此了解哪些文件被打开,由哪些进程打开,可以帮助我们更好地了解系统的运行情况。 命令语法 lsof [ -?abCcEfgHhiKklLnNOPRstUuVvXx] [ -A [afgG…

    other 2023年6月28日
    00
  • 简单实用的磁带转mp3方法图解

    以下是详细讲解“简单实用的磁带转MP3方法图解的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: 简单实用的磁带转MP3方法图解攻略 如果您有一些老式的磁带录音,想要将它们转换成数字格式,以便在现代设备上播放和存储,那么本攻略将为您提供一种简单实用的磁带转MP3的方法。本攻略将包括以下步骤:准备工作、连接设备、录制音频、转换格式、保存文…

    other 2023年5月10日
    00
  • js预加载图片方法汇总

    关于 “js预加载图片方法汇总”,我将会为您提供完整的攻略。 目录 什么是预加载图片 预加载图片的优点 JS 预加载图片方法汇总 Image 对象 Ajax HTML5 prefetch Web Font Loader LazyLoad 什么是预加载图片 预加载图片是指在页面加载后,提前把一些重要的图片下载到客户端缓存里,以便在需要显示时能够更快速地获取图片…

    other 2023年6月25日
    00
  • Spring boot配置文件加解密详解

    Spring Boot 配置文件加解密详解 在实际开发过程中,我们通常需要在配置文件中包含敏感信息(如:数据库用户名,密码等),但是为了避免这些敏感信息泄露,我们需要对这些信息进行加密保护。相信很多小伙伴都遇到过这样的问题,那么本文将为大家详细讲解如何在 Spring Boot 中使用 jasypt 对配置文件进行加解密,让大家轻松解决这一问题。 1. 添加…

    other 2023年6月25日
    00
  • 基于WPF实现简单的下拉筛选控件

    我会详细讲解基于WPF实现简单的下拉筛选控件的完整攻略。该控件可以用于Windows应用程序中,用于实现下拉菜单中的筛选选项。 步骤一:创建WPF项目 首先,我们需要创建一个WPF项目。 打开Visual Studio,并选择创建新项目。 在弹出的新项目窗口中,选择”Visual C#”分类,并选择”WPF应用程序”。 为项目设置名称,并选择保存路径,最后点…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部