C++实现图的遍历算法(DFS,BFS)的示例代码

目录
  • 图的定义
  • 图的相关术语
  • 图的创建(邻接矩阵)---结构体
  • 图的创建(邻接矩阵)---邻接矩阵的创建
  • 图的创建(邻接表)---结构体
  • 图的创建(邻接表)---邻接表的创建
  • 对邻接矩阵进行深度优先遍历
  • 对邻接矩阵进行广度优先遍历
  • 对邻接表进行深度优先遍历
  • 对邻接表进行广度优先遍历
  • 整体代码
  • 结果展示

图的定义

图由顶点集V(G)和边集E(G)组成,记为G=(V,E)。其中E(G)是边的有限集合,边是顶点的无序对(无向图)或有序对(有向图)。对于有向图来说,E(G)是有向边(也称弧(Arc))的有限集合,弧是顶点的有序对,记为<v,w>,v、w是顶点,v为弧尾(箭头根部),w为弧头(箭头处)。对于无向图来说,E(G)是边的有限集合,边是顶点的无序对,记为(v, w)或者(w, v),并且(v, w)=(w,v)。

图的相关术语

①顶点(Vertex):图中的数据元素。

②顶点v的度:与v相关联的边的数目;

③顶点v的出度:以v为起点有向边数;

④顶点v的入度:以v为终点有向边数。

⑤边:顶点之间的逻辑关系用边来表示,边集可以是空的。

⑥无向边(Edge):若顶点V1到V2之间的边没有方向,则称这条边为无向边。

⑦无向图(Undirected graphs):图中任意两个顶点之间的边都是无向边。(A,D)=(D,A)

⑧有向边:若从顶点V1到V2的边有方向,则称这条边为有向边,也称弧(Arc)。用<V1,V2>表示,V1为狐尾(Tail),V2为弧头(Head)。(V1,V2)≠(V2,V1)。

⑨有向图(Directed graphs):图中任意两个顶点之间的边都是有向边。

注意:无向边用“()”,而有向边用“< >”表示。

⑩简单图:图中不存在顶点到其自身的边,且同一条边不重复出现。

⑪无向完全图:无向图中,任意两个顶点之间都存在边。

⑫有向完全图:有向图中,任意两个顶点之间都存在方向互为相反的两条弧。

⑬稀疏图:有很少条边。

⑭稠密图:有很多条边。

⑮权(Weight):与图的边或弧相关的数。

⑯网(Network):带权的图。

⑰连通图:图中任意两个顶点都是连通的。

⑱极大连通子图:该子图是G连通子图,将G的任何不在该子图的顶点加入,子图将不再连通。

⑲极小连通子图:该子图是G的连通子图,在该子图中删除任何一条边,子图都将不再连通。

图的创建(邻接矩阵)---结构体

typedef struct
{
    //用来存放顶点
    int vexs[MAX];
    //二维数组:用来存放两点之间的关系
    int arcs[MAX][MAX];
    //图的顶点数和边数
    int vexsum, arcsnum;
}AMGraph,*StrAMGraph;

图的创建(邻接矩阵)---邻接矩阵的创建

int locate(AMGraph&G, int n)
{
    for (int i = 0; i < G.vexsum; i++)
    {
        if (G.vexs[i] == n)
        {
            return i;
        }
    }
}

//创建邻接矩阵
void Creat(AMGraph&G)
{
    int v1 = 0, v2 = 0, w = 0;
    cin >> G.vexsum >> G.arcsnum;
    for (int i = 0; i < G.vexsum; i++)
    {
        cin >> G.vexs[i];
    }
    for (int i = 0; i < G.vexsum; i++)
    {
        for (int j = 0; j < G.vexsum; j++)
        {
            G.arcs[i][j] = 0;
        }
    }
    for (int k = 0; k < G.arcsnum; k++)
    {
        cin >> v1 >> v2 >> w;
        int i = locate(G, v1);
        int j = locate(G, v2);
        G.arcs[i][j] = w;
    }
}

图的创建(邻接表)---结构体

typedef struct ArcNode
{
    int Adjust;
    struct ArcNode *next;
}AcrNode,*StrAcrNode;

typedef struct
{
    int data;
    StrAcrNode next;
}HeadNode, *StrHeadNode;

typedef struct
{
    HeadNode arr[MAX];
    int acsrnum, vexsnum;
}ALGraph, *StrALGraph;

图的创建(邻接表)---邻接表的创建

int locate1(ALGraph&G, int n)
{
    for (int i = 0; i < G.vexsnum; i++)
    {
        if (G.arr[i].data == n)
        {
            return i;
        }
    }
}

void CreatALGraph(ALGraph&G)
{
    int v1 = 0, v2 = 0, w = 0;
    cin >> G.vexsnum >> G.acsrnum;
    for (int i = 0; i < G.vexsnum; i++)
    {
        cin >> G.arr[i].data;
        G.arr[i].next = NULL;
    }
    for (int k = 0; k < G.acsrnum; k++)
    {
        cin >> v1 >> v2;
        int i = locate1(G, v1);
        int j = locate1(G, v2);
        StrAcrNode p1;
        p1 = new AcrNode;
        p1->next = G.arr[i].next;
    }
}

对邻接矩阵进行深度优先遍历

//对邻接矩阵进行深度优先遍历
void DFS(AMGraph&G, int n)
{
    cout << G.vexs[n] << " ";
    visit[n] = 1;
    for (int i = 0; i < G.vexsum; i++)
    {
        if (G.arcs[n][i] != 1 && visit[i] != 1)
        {
            DFS(G, G.arcs[n][i]);
        }
    }
}

对邻接矩阵进行广度优先遍历

queue<int> qu;
//对邻接矩阵进行广度优先遍历
void BFS(AMGraph&G, int n)
{
    cout << G.vexs[n] << " ";
    qu.push(n);
    while (!qu.empty())
    {
        int m = qu.front();
        qu.pop();
        for (int i = 0; i < G.vexsum; i++)
        {
            if (visit[i] != 1 && G.arcs[m][i] != 1)
            {
                cout << G.vexs[i] << " ";
                visit[i] = 1;
                qu.push(i);
            }
        }
    }
}

对邻接表进行深度优先遍历

void DFS1(ALGraph&G, int n)
{
    cout << G.arr[n].data << " ";
    visit3[n] = 1;
    StrAcrNode p1;
    p1 = G.arr[n].next;
    while (p1)
    {
        int w = p1->Adjust;
        if (visit3[w] != 1)
        {
            DFS1(G, w);
        }
        p1 = p1->next;
    }
}

queue<int> qu1;

对邻接表进行广度优先遍历

queue<int> qu1;
void BFS(ALGraph&G, int n)
{
    cout << G.arr[n].data << " ";
    visit4[n] = 1;
    qu1.push(n);
    StrAcrNode p1;
    p1 = G.arr[n].next;
    while (!qu1.empty())
    {
        qu1.pop();
        int w = p1->Adjust;
        while (p1)
        {
            if (visit4[w] != 1)
            {
                qu1.push(w);
                visit4[w] = 1;
            }
            p1 = p1->next;
        }
    }
}

整体代码

#include<iostream>
#include<queue>
using namespace std;
const int MAxInt = 10;
int visit[MAxInt];

typedef struct
{
    int vexs[MAxInt];
    int arcs[MAxInt][MAxInt];
    int arcnum, vexsnum;
}AMGraph;

int locate(AMGraph&G, int n)
{
    for (int i = 0; i < G.vexsnum; i++)
    {
        if (G.vexs[i] == n)
        {
            return i;
        }
    }
}

void Creat(AMGraph&G)
{
    int v1 = 0, v2 = 0, w = 0;
    cin >> G.vexsnum >> G.arcnum;
    for (int i = 0; i < G.vexsnum; i++)
    {
        cin >> G.vexs[i];
    }
    for (int i = 0; i < G.vexsnum; i++)
    {
        for (int j = 0; j < G.vexsnum; j++)
        {
            G.arcs[i][j] = MAxInt;
        }
    }
    for (int k = 0; k < G.arcnum; k++)
    {
        cin >> v1 >> v2 >> w;
        int i = locate(G, v1);
        int j = locate(G, v2);
        G.arcs[i][j] = w;
        G.arcs[j][i] = w;
    }
}

queue<int> qu;
void BFS(AMGraph G, int v)
{
    cout << G.vexs[v];
    qu.push(v);
    visit[v] = 1;
    while (!qu.empty())
    {
        int w = qu.front();
        qu.pop();
        for (int i = 0; i < G.vexsnum; i++)
        {
            if (visit[i] != 1 && G.arcs[w][i] != MAxInt)
            {
                cout << G.vexs[i] << " ";
                visit[i] = 1;
                qu.push(i);
            }
        }
    }
}

int main()
{
    AMGraph G;
    Creat(G);
    cout << "对图进行广度优先遍历的结果为" << endl;
    BFS(G, 1);
    return 0;
}

注意 :这里的代码是创建一个邻接矩阵来对图进行广度优先遍历,对图进行深度优先遍历以及临界表实现对图进行广度优先遍历,对图进行深度优先遍历大家都可以通过上面的代码块进行自由组合实现,这里就不进行一一实现。

结果展示

以上就是C++实现图的遍历算法(DFS,BFS)的示例代码的详细内容,更多关于C++ DFS BFS的资料请关注我们其它相关文章!

(0)

相关推荐

  • C++验证LeetCode包围区域的DFS方法

    验证LeetCode Surrounded Regions 包围区域的DFS方法 在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中的最后一个条件必须是j > 1,如下面的红色字体所示,如果写成j > 0的话无法通过OJ,一直百思不得其解其中的原因,直到有网友告诉我说他验证了最后一个大集合在本地机子上可以通过,那么我也来验证看看吧. class Solution { public: void solve(vector<vector<

  • C++详细讲解图的遍历

    目录 图的遍历 图的深度优先遍历(DFS, depth first search) 图的宽度优先遍历(BFS, breadth first search) 宽度优先搜索BFS的应用 深度优先遍历DFS的应用 图的遍历 要想遍历图,肯定要先储存图啊. 下面我们采用邻接表来存图 也可以看: 点这里 1.用 h 数组保存各个节点能到的第一个节点的编号.开始时,h[i] 全部为 -1. 2.用 e 数组保存节点编号,ne 数组保存 e 数组对应位置的下一个节点所在的索引. 3.用 idx 保存下一个 e

  • C++ DFS算法实现走迷宫自动寻路

    C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容如下 深度优先搜索百度百科解释: 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 运行效果: 说明: 深度优先搜索算法是在我在图的部分接触到的,后来才发现它也可以不用在图的遍历上,它是一个独立的算法,它也可以直接用在一个二维数组上. 其算法原理和实现步骤在代码中已经有了很好的体现了,这里就不再赘述. 在程序

  • 最短时间学会基于C++实现DFS深度优先搜索

    目录 前言 1.迷宫找出口,区分dfs,bfs: 一.DFS经典放牌可能组合 二.leetcode 员工的重要性 三.leetcode 图像渲染 四.leetcode 被围绕的区域 五.岛屿数量 六. 小练习:岛屿的最大面积 总结 前言 同学们肯定或多或少的听到过别人提起过DFS,BFS,却一直都不太了解是什么,其实两个各为搜索算法,常见使用 深度优先搜索(DFS) 以及 广度优先搜索(BFS) ,今天我们就来讲讲什么是深度优先搜索,深度优先就是撞到了南墙才知道回头,才会往上一层返回. 1.迷宫

  • C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析

    本文实例讲述了C++实现图的邻接矩阵存储和广度.深度优先遍历的方法.分享给大家供大家参考.具体如下: 示例:建立如图所示的无向图 由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边. 示例输入(按照这个格式输入): 5 6 abcde 0 1 1 0 2 1 0 3 1 2 3 1 2 4 1 1 4 1 输入结束(此行不必输入) 注:0 1 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a->b所示       0 2 1表示该图的第0个顶点和第2个定点有边相连,如上图中的a

  • C++ 基于BFS算法的走迷宫自动寻路的实现

    1.效果图 其中正方形代表障碍物,实心菱形代表移动者(人),空心菱形代表目标位置(都是可以在代码中修改的) 本例使用队列(链表实现),以广度优先进行自动寻路. 2.实现代码 1.队列方法类 coolQueue.h #pragma once #include <iostream> using namespace std; //队列 //坐标结构体 struct Point { int x; int y; Point() { x = 0; y = 0; } Point(int in_x, int

  • C++实现广度优先遍历图

    本文实例为大家分享了C++实现广度优先遍历图的具体代码,供大家参考,具体内容如下 广度优先遍历 void bfs(int start, int parent[], int dist[], int seen[], int visited[]) { std::queue <int> q;//建立数据队列q int v; q.push(start); //让开始序列入栈 parent[start] = start; // 开始节点的父节点是开始节点 dist[start] = 0; // 初始化距离

  • C++实现图的邻接表存储和广度优先遍历实例分析

    本文实例讲述了C++实现图的邻接表存储和广度优先遍历方法.分享给大家供大家参考.具体如下: 示例:建立如图所示的无向图 由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边. 示例输入(按照这个格式输入): 5 6 abcde 0 1 0 2 0 3 2 3 2 4 1 4 输入结束(此行不必输入) 注:0 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a->b所示       0 2表示该图的第0个顶点和第2个定点有边相连,如上图中的a->c所示       2 3表示该图的

  • C++实现图的遍历算法(DFS,BFS)的示例代码

    目录 图的定义 图的相关术语 图的创建(邻接矩阵)---结构体 图的创建(邻接矩阵)---邻接矩阵的创建 图的创建(邻接表)---结构体 图的创建(邻接表)---邻接表的创建 对邻接矩阵进行深度优先遍历 对邻接矩阵进行广度优先遍历 对邻接表进行深度优先遍历 对邻接表进行广度优先遍历 整体代码 结果展示 图的定义 图由顶点集V(G)和边集E(G)组成,记为G=(V,E).其中E(G)是边的有限集合,边是顶点的无序对(无向图)或有序对(有向图).对于有向图来说,E(G)是有向边(也称弧(Arc))的

  • C语言实现交换排序算法(冒泡,快速排序)的示例代码

    目录 前言 一.冒泡排序 1.基本思想 2.优化 3.扩展 二.快速排序 1.基本思想 2.优化 3.代码 前言 查找和排序是数据结构与算法中不可或缺的一环,是前辈们在算法道路上留下的重要且方便的一些技巧,学习这些经典的查找和排序也能让我们更好和更快的解决问题.在这个专栏中我们会学习六大查找和十大排序的算法与思想,而本篇将详细讲解其中的交换排序——冒泡排序和快速排序: 注意:本文中所有排序按照升序排序,降序只需要把逻辑反过来即可! 一.冒泡排序 1.基本思想 对于很多同学来说冒泡排序是再熟悉不过

  • python和pywin32实现窗口查找、遍历和点击的示例代码

    Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量.接口.线程以及COM机制等等. 1.通过类名和标题查找窗口句柄,并获得窗口位置和大小 import win32gui import win32api classname = "MozillaWindowClass" titlename = "百度一下,你就知道 - Mozilla Firefox" #获取句柄 hwnd = win32gui.Fin

  • c# 遍历获取所有文件的示例代码

    在使用C#进行桌面应用开发中,经常会有对文件进行操作的情况,这时可能会需要对文件夹进行文件扫描,获取所有文件 做法如下 /// <summary> /// 遍历获取所有文件 /// </summary> /// <param name="filePathByForeach"></param> /// <param name="result"></param> public static void

  • Javascript遍历table中的元素示例代码

    例如: <table id=tb> <tr><th> </th><th> </th><th> </th><th> </th></tr> <tr><td> </td><td> </td><td> </td><td> </td></tr> <tr>&

  • Python算法之图的遍历

    本节主要介绍图的遍历算法BFS和DFS,以及寻找图的(强)连通分量的算法 Traversal就是遍历,主要是对图的遍历,也就是遍历图中的每个节点.对一个节点的遍历有两个阶段,首先是发现(discover),然后是访问(visit).遍历的重要性自然不必说,图中有几个算法和遍历没有关系?! [算法导论对于发现和访问区别的非常明显,对图的算法讲解地特别好,在遍历节点的时候给节点标注它的发现节点时间d[v]和结束访问时间f[v],然后由这些时间的一些规律得到了不少实用的定理,本节后面介绍了部分内容,感

  • Python基于回溯法子集树模板实现图的遍历功能示例

    本文实例讲述了Python基于回溯法子集树模板实现图的遍历功能.分享给大家供大家参考,具体如下: 问题 一个图: A --> B A --> C B --> C B --> D B --> E C --> A C --> D D --> C E --> F F --> C F --> D 从图中的一个节点E出发,不重复地经过所有其它节点后,回到出发节点E,称为一条路径.请找出所有可能的路径. 分析 将这个图可视化如下: 本问题涉及到图,那首

  • C语言实现图的遍历之深度优先搜索实例

    DFS(Depth-First-Search)深度优先搜索算法是图的遍历算法中非常常见的一类算法.分享给大家供大家参考.具体方法如下: #include <iostream> #include <algorithm> #include <iterator> using namespace std; #define MAX_VERTEX_NUM 10 struct Node { int adjvex; struct Node *next; int info; }; typ

  • 基于Java实现的图的广度优先遍历算法

    本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组vertex中 3.初始化邻接矩阵: 4.依次输入每条边存储在邻接矩阵arc中 输入边依附的两个顶点的序号i,j: 将邻接矩阵的第i行第j列的元素值置为1: 将邻接矩阵的第j行第i列的元素值置为1: 广度优先遍历实现: 1.初始化队列Q 2.访问顶点v:visited[v]=1;顶点v入队Q; 3.while(队列Q非空) v=队列

  • C语言数据结构与算法之图的遍历

    目录 引入  深度优先搜索 代码实现  完整代码   引入  在数据结构中常见的有深度优先搜索和广度优先搜索.为什么叫深度和广度呢?其实是针对图的遍历而言的,请看下面这个图: 图是由一些小圆点(称为顶点) 和 连接这些点的直线 (称为边)组成的. 例如上图就是由5个顶点(编号为 1,2,3,4,5) 和5条边(1-2,1-3,1-4,2-4)组成. 现在我们从1号顶点开始遍历这个图,遍历就是把图的每一个顶点都访问一次.使用深度优先搜索将会得到如下的结果. 图中每个顶点旁边的数表示这个顶点是第几个

随机推荐