图的深度和广度优先遍历

  • 图的深度优先遍历
    • 1、算法思想
    • 2、邻接矩阵构造图
    • 3、邻接表构造图
  • 图的广度优先遍历
    • 1、算法思想
    • 2、邻接矩阵构造图

图的深度优先遍历

1、算法思想

  • (1)从图中的某个初始点 v 出发,首先访问初始点 v.
  • (2)选择一个与顶点 v 相邻且没被访问过的顶点 ver ,以 ver为初始顶点,再从它出发进行深度优先遍历。
  • (3)当路径上被遍历完,就访问上一个顶点的第 二个相邻顶点。
  • (4)直到所有与初始顶点 v联通的顶点都被访问。

2、邻接矩阵构造图

#include <iostream>
#include <vector>using namespace std;#define VERTEXNUM 5void createGraph(vector<vector<int>>&edge, int start, int end);
void displayGraph(vector<vector<int>>&edge);
void DFS(vector<vector<int>>&edge , vector<int>& vertexStatusArr);
void DFScore(vector<vector<int>>&edge, int i, vector<int>& vertexStatusArr);int main(void) {//初始化邻接矩阵vector<vector<int>>edge(VERTEXNUM, vector<int>(VERTEXNUM, 0));//存放顶点的遍历状态,0:未遍历,1:已遍历  vector<int> vertexStatusArr (VERTEXNUM,0);cout << "after init: " << endl;displayGraph(edge);//创建图createGraph(edge, 0, 3);createGraph(edge, 0, 4);createGraph(edge, 3, 1);createGraph(edge, 3, 2);createGraph(edge, 4, 1);cout << "after create: " << endl;displayGraph(edge);//深度优先遍历DFS(edge, vertexStatusArr);return 0;
}
//创建图
void createGraph(vector<vector<int>>&edge, int start, int end) {edge[start][end] = 1;
}
//打印存储的图
void displayGraph(vector<vector<int>>&edge) {int i, j;for (i = 0; i<VERTEXNUM; i++) {for (j = 0; j<VERTEXNUM; j++) {//printf("%d ", edge[i][j]);cout << edge[i][j] << " ";}cout << endl;}
}
//深度优先遍历
void DFS(vector<vector<int>>&edge, vector<int>& vertexStatusArr) {cout << "start BFT graph: " << endl;for (int i = 0; i<VERTEXNUM; i++) {DFScore(edge, i, vertexStatusArr);}cout << endl;
}
void DFScore(vector<vector<int>>&edge, int i, vector<int>& vertexStatusArr) {if (vertexStatusArr[i] == 1) {return;}cout << i << " ";vertexStatusArr[i] = 1;for (int j = 0; j<VERTEXNUM; j++) {if (edge[i][j] == 1) {DFScore(edge, j, vertexStatusArr);}}
}

设有n个点,e条边
邻接矩阵:矩阵包含n ^2个元素,在算法中,共n个顶点,对每个顶点都要遍历n次,所以时间复杂度为O(n^2)

3、邻接表构造图

#include <stdio.h>
#include <malloc.h>#define VERTEXNUM 5//存放顶点的邻接表元素
typedef struct edge {int vertex;struct edge* next;
}st_edge;void createGraph(st_edge** edge, int start, int end);
void displayGraph(st_edge** edge);
void delGraph(st_edge** edge);
void DFT(st_edge** edge, int* vertexStatusArr);
void DFTcore(st_edge** edge, int i, int* vertexStatusArr);int main(void) {//动态创建存放边的指针数组   st_edge** edge = (st_edge**)malloc(sizeof(st_edge*)*VERTEXNUM);int i;for (i = 0; i<VERTEXNUM; i++) {edge[i] = NULL;}//存放顶点的遍历状态,0:未遍历,1:已遍历  int* vertexStatusArr = (int*)malloc(sizeof(int)*VERTEXNUM);for (i = 0; i<VERTEXNUM; i++) {vertexStatusArr[i] = 0;}printf("after init:\n");displayGraph(edge);//创建图  createGraph(edge, 0, 3);createGraph(edge, 0, 4);createGraph(edge, 3, 1);createGraph(edge, 3, 2);createGraph(edge, 4, 1);printf("after create:\n");displayGraph(edge);//深度优先遍历 DFT(edge, vertexStatusArr);//释放邻接表占用的内存  delGraph(edge);edge = NULL;free(vertexStatusArr);vertexStatusArr = NULL;return 0;
}
//创建图
void createGraph(st_edge** edge, int start, int end) {st_edge* newedge = (st_edge*)malloc(sizeof(st_edge));newedge->vertex = end;newedge->next = NULL;edge = edge + start;while (*edge != NULL) {edge = &((*edge)->next);}*edge = newedge;
}
//打印存储的图
void displayGraph(st_edge** edge) {int i;st_edge* p;for (i = 0; i<VERTEXNUM; i++) {printf("%d:", i);p = *(edge + i);while (p != NULL) {printf("%d ", p->vertex);p = p->next;}printf("\n");}
}
//释放邻接表占用的内存
void delGraph(st_edge** edge) {int i;st_edge* p;st_edge* del;for (i = 0; i<VERTEXNUM; i++) {p = *(edge + i);while (p != NULL) {del = p;p = p->next;free(del);}edge[i] = NULL;}free(edge);
}
//深度优先遍历
void DFT(st_edge** edge, int* vertexStatusArr) {printf("start BFT graph:\n");int i;for (i = 0; i<VERTEXNUM; i++) {DFTcore(edge, i, vertexStatusArr);}printf("\n");
}void DFTcore(st_edge** edge, int i, int* vertexStatusArr) {if (vertexStatusArr[i] == 1) {return;}printf("%d ", i);vertexStatusArr[i] = 1;st_edge* p = *(edge + i);while (p != NULL) {DFTcore(edge, p->vertex, vertexStatusArr);p = p->next;}
}

邻接表:包含n个头结点和e个表结点,算法中对所有结点都要遍历一次,所以时间复杂度为O(n+e)

图的广度优先遍历

1、算法思想

广度优先遍历( Breadth_First_Search) ,又称为广度优先搜索,简称BFS。

它的思想是:

从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,
然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。
如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

2、邻接矩阵构造图

#include <iostream>
#include <vector>
#include <queue>using namespace std;#define VERTEXNUM 5void createGraph(vector<vector<int>>&edge, int start, int end);
void displayGraph(vector<vector<int>>&edge);
void DFS(vector<vector<int>>&edge, vector<int>& vertexStatusArr);
void DFScore(vector<vector<int>>&edge, int i, vector<int>& vertexStatusArr);
void BFS(vector<vector<int>>&edge, vector<int>& vertexStatusArr);int main(void) {//初始化邻接矩阵vector<vector<int>>edge(VERTEXNUM, vector<int>(VERTEXNUM, 0));//存放顶点的遍历状态,0:未遍历,1:已遍历  vector<int> vertexStatusArr(VERTEXNUM, 0);cout << "after init: " << endl;displayGraph(edge);//创建图createGraph(edge, 0, 3);createGraph(edge, 0, 4);createGraph(edge, 3, 1);createGraph(edge, 3, 2);createGraph(edge, 4, 1);cout << "after create: " << endl;displayGraph(edge);//深度优先遍历//DFS(edge, vertexStatusArr);BFS(edge, vertexStatusArr);return 0;
}
//创建图
void createGraph(vector<vector<int>>&edge, int start, int end) {edge[start][end] = 1;
}
//打印存储的图
void displayGraph(vector<vector<int>>&edge) {int i, j;for (i = 0; i<VERTEXNUM; i++) {for (j = 0; j<VERTEXNUM; j++) {//printf("%d ", edge[i][j]);cout << edge[i][j] << " ";}cout << endl;}
}//BFS
void BFS(vector<vector<int>>&edge ,vector<int>& vertexStatusArr) {queue<int>q;q.push(0);vertexStatusArr[0] = 1;int idx = 0;while (!q.empty()){idx = q.front();q.pop();cout << idx << " ";for (int j = 0; j< VERTEXNUM; j++) {if (edge[idx][j] == 1 && vertexStatusArr[j] == 0){q.push(j);vertexStatusArr[j] = 1;}}}cout << endl;
}

C++实现图的深度优先遍历和广度优先遍历相关推荐

  1. 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...

    图的深度优先遍历 题目:写出附从每个顶点出发的一次深度优先搜索遍历序列.在纸上画出遍历过程和序列,提交截图. 错误回答 从A点开始遍历:0124-01324-0134-0324-034 从B点开始遍历 ...

  2. 大话数据结构 17:图的深度优先遍历和广度优先遍历

    深度优先遍历 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底-,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点 ...

  3. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  4. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  5. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  6. 多级树的深度优先遍历与广度优先遍历(Java实现)

    目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...

  7. 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

    无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...

  8. 实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。

    软件学院实验报告 姓名:              学号:              专业:               年级: 课程名称 数据结构 实验名称 实验9.图的遍历 实验的准备阶段 实验内 ...

  9. 图的深度优先搜索和广度优先搜索

    一.深度优先搜索(DFS) 每次都在访问完当前节点后首先访问当前节点的第一个邻接节点,可以看出这是一个递归的过程. 深度优先遍历算法步骤: 1.访问初始尾结点v,并标记结点v已经访问 2.查找结点v的 ...

  10. 二叉树深度优先遍历和广度优先遍历

    二叉树深度优先遍历和广度优先遍历

最新文章

  1. android 获取网卡mac_防亚马逊账号关联黑科技--如何修改我们的网卡MAC到底重要不?...
  2. rx在c语言中,RxSwift - 入门
  3. 一、flask的基本使用-flask
  4. Linux - 系统资源
  5. OGRE 学习小记 开发环境的配置
  6. 交叉编译 for arm-linux-gcc... no,QT4.8.6、tslib库移植到arm上配置出错!求大神指点
  7. qimage加载bmp图片_9个最佳的优化动态gif图片大小的工具
  8. NoSQL Manager for MongoDB 破解
  9. jQuery插件开发(转)
  10. AngularJS Providers 详解
  11. 安装IIS以及配置ASP.NET流程
  12. 4 配置端口聚合提供冗余备份链路
  13. C语言中整型变量四舍五入,怎样将整型变量按四舍五入转换成整数
  14. tensorflow的数据读取 tf.data.DataSet、tf.data.Iterator
  15. 利用python来解决 小鸡,公鸡,母鸡的数学问题
  16. ECBS多机器人路径规划
  17. 把中文目录名称修改成英文首字母大写或中文拼音目录
  18. MyBatis基础原理
  19. Android app内部下载安装
  20. 20221128-20221202周总结

热门文章

  1. 《Linux Device Drivers》第十五章 内存映射和DMA——note
  2. 浅谈EntityFramework框架的使用
  3. 关于Html中jsp调用Android中方法无效的一点建议
  4. 【LeetCode】104. Maximum Depth of Binary Tree (2 solutions)
  5. WebSphere应用程序服务器Web容器设置
  6. 换光纤猫 ZXA10 F420
  7. 八部委宰割C类电商 消费者必遭殃
  8. AC自动机解决字符集很大的情况(可持久化数组优化getfail的过程)
  9. CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)
  10. sscanf()函数的用法