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

yizhihongxing

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日

相关文章

  • win10系统steam磁盘写入错误怎么办 steam磁盘写入错误的解决教程

    Win10系统Steam磁盘写入错误解决教程 Steam是一款非常流行的游戏平台,但有时候在更新或者安装游戏时,会出现磁盘写入错误的问题。本文将介绍怎样解决这个问题。 问题描述 在更新或者安装游戏时,Steam提示磁盘写入错误,具体错误信息如下: An error occurred while updating [游戏名] (disk write error…

    other 2023年6月26日
    00
  • C语言全方位讲解数组的使用

    C语言全方位讲解数组的使用 什么是数组 数组是C语言中存储同类型数据的一种数据结构,数组中的元素通过下标来索引,下标从0开始。数组是一个连续的内存块,每个元素占一个相同的存储单元。 声明数组 数组的声明方式为: type arrayName[arraySize]; 其中,type表示数据类型,arrayName表示数组的名称,arraySize表示数组的大小…

    other 2023年6月20日
    00
  • Win10一周年更新14393.1480更新补丁KB4025339下载地址

    Win10一周年更新14393.1480更新补丁KB4025339下载地址攻略 简介 Win10一周年更新14393.1480是Windows 10操作系统的一个重要更新补丁,它修复了一些安全漏洞和系统稳定性问题。本攻略将详细介绍如何下载和安装这个更新补丁。 步骤 打开浏览器,进入微软官方网站。 在微软官方网站的搜索框中输入“Win10一周年更新14393.…

    other 2023年8月5日
    00
  • 关于linux:apt-get:找不到命令

    当在Linux系统中使用apt-get命令时,有时会出现“找不到命令”的错误。这通常是由于系统中没有安装apt-get或者apt-get不在系统的PATH环境变量中。以下解决这个问题的两种方法: 方法1:安装apt-get 如果系统中没有安装apt-get,可以通过以下命令安装: sudo apt-get update sudo apt-get instal…

    other 2023年5月7日
    00
  • springboot如何获取接口下所有实现类

    要获取接口下的所有实现类可以采用Java反射机制来实现,Spring Boot框架提供了很多工具类和注解来帮助我们实现这一功能。下面是详细步骤: 一、定义接口类在我们获取接口下的所有实现类之前,首先需要定义用于接口的类。在这里我们定义一个Animal接口,代码如下: public interface Animal { void eat(); } 二、定义接口…

    other 2023年6月26日
    00
  • android杂记:C++文件的添加log方法分享

    下面我来详细讲解一下“android杂记:C++文件的添加log方法分享”的完整攻略。 前言 Android应用开发中使用C++的情况较为普遍。在C++中添加日志系统,可以方便开发者查看和追踪程序的执行情况,甚至可以用于分析程序的性能和错误。本篇文章将分享如何在C++的文件中添加日志输出的方法,在Android开发中更加便捷地使用C++。 步骤 步骤一:添加…

    other 2023年6月26日
    00
  • 关于c#:removeallforobservablecollections?

    以下是关于“关于C#: RemoveAll for ObservableCollections?”的完整攻略,包含两个示例。 关于C#: RemoveAll for ObservableCollections? 在C#中,ObservableCollection类是一种可观察的集合,它提供了许多有用的方法,例如Add、Remove和Clear。但是,Obse…

    other 2023年5月9日
    00
  • .httacces文件的配置技巧

    下面是“.htaccess文件的配置技巧”的完整攻略: 什么是“.htaccess”文件? “.htaccess”是 Apache Web服务器上存放在网站根目录下的隐藏文件,它允许用户在不修改服务器配置文件的情况下对网站进行一些配置和控制访问。这个文件里面的指令可以用来精确控制Web服务器的行为,例如重写URL、防止目录遍历攻击、设置用户身份验证等。 如何…

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