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日

相关文章

  • 基于jQuery封装的分页组件

    下面我来为您详细讲解 “基于jQuery封装的分页组件” 的完整攻略。 概述 “基于jQuery封装的分页组件”是一种可以方便地实现分页功能的插件。它可以帮助开发者实现数据分页显示的功能,同时还可以根据实际需要进行自定义配置。 使用步骤 步骤1:引入jQuery和分页组件的JS和CSS文件 在head标签中引入jQuery和分页组件的JS和CSS文件。其中,…

    other 2023年6月25日
    00
  • centos7.7安装教程

    CentOS 7.7 安装教程 CentOS是一种基于Red Hat Enterprise Linux(RHEL)源代码的自由开源操作系统。本攻略将介绍如何在计算机上安装CentOS 7.7。 步骤一:下载CentOS 7.7 首先,我们需要从CentOS官网下载CentOS 7.7ISO镜像文件。以下是下载链接: CentOS 7.7 下载链接 步骤二:创…

    other 2023年5月9日
    00
  • Qt CEF融合技QCefView使用教程(推荐)

    下面我将为您提供“Qt CEF融合技QCefView使用教程(推荐)”的完整攻略。 1. 什么是QCefView QCefView是一种Qt封装的CEF浏览器集成方案,它为开发人员提供了一种便捷的方式,可在Windows、Linux和Mac OS X平台上将基于CEF的浏览器内核快速集成到Qt应用程序中。 2. 使用QCefView的步骤 以下为使用QCef…

    other 2023年6月27日
    00
  • Python使用Selenium WebDriver的入门介绍及安装教程(最新推荐)

    以下是“Python使用Selenium WebDriver的入门介绍及安装教程(最新推荐)”的完整攻略: 简介 Selenium是一个自动化测试框架,最初是为Web应用程序测试而创建的。 Selenium WebDriver是Selenium的一个分支,它提供了一组API用于自动化操作Web浏览器。 使用Python编写Selenium脚本可以自动完成We…

    other 2023年6月27日
    00
  • 破解浏览器内网页禁用鼠标右键的N个绝招

    下面是破解浏览器内网页禁用鼠标右键的N个绝招的完整攻略: 1. 绕过disableContextMenu属性 有些网站可能会使用JS来禁用你的右键,具体的实现方式是通过设置HTML元素的disableContextMenu属性为true。这种情况下,我们可以通过Chrome开发者工具来方便的取消这个属性的禁用。 示例:在Chrome浏览器中打开一个网页,比如…

    other 2023年6月27日
    00
  • 在Python中使用Mako模版库的简单教程

    下面是在Python中使用Mako模版库的简单教程: 什么是Mako模版库? Mako是一个功能强大且易于使用的Python模板库,用于生成HTML,XML等标记语言和任何其他纯文本格式。它基于类似于Jinja2和Cheetah的模板语言,具有简单的表达式,控制结构和过滤器。Mako还集成了Python表达式,所以您可以写更多的逻辑代码来控制您的模板。 安装…

    other 2023年6月27日
    00
  • MySQL数据库输入密码后闪退问题的解决方法

    下面就是详细讲解MySQL数据库输入密码后闪退的解决方法完整攻略: 问题背景 MySQL是一种开源数据库,常用于Web应用程序的后台支持。在使用MySQL时,经常会遇到以下问题:输入密码后闪退。 解决方法 MySQL输入密码后闪退问题通常是由于MySQL配置文件中的一些错误或问题导致的。可以通过以下步骤解决这个问题: 步骤1:检查MySQL配置文件 首先,打…

    other 2023年6月26日
    00
  • 迅捷路由器FW325R的无线桥接

    迅捷路由器FW325R的无线桥接 迅捷路由器FW325R是一款兼具性价比和性能的路由器。它基于802.11ac无线标准和4个高性能天线,为您提供快速、可靠的WiFi连接。 在一些场景下,您可能需要将互联网连接控制在一个区域内。比如,您的电视在客厅,而互联网光猫在卧室。这时,您可以通过无线桥接实现客厅中的设备通过FW325R的无线信号访问互联网。 下面,我们将…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部