C++实现图的深度优先遍历和广度优先遍历
图的深度和广度优先遍历
- 图的深度优先遍历
- 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++实现图的深度优先遍历和广度优先遍历相关推荐
- 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...
图的深度优先遍历 题目:写出附从每个顶点出发的一次深度优先搜索遍历序列.在纸上画出遍历过程和序列,提交截图. 错误回答 从A点开始遍历:0124-01324-0134-0324-034 从B点开始遍历 ...
- 大话数据结构 17:图的深度优先遍历和广度优先遍历
深度优先遍历 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底-,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点 ...
- 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现
邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...
- 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解
邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...
- 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历
简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...
- 多级树的深度优先遍历与广度优先遍历(Java实现)
目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...
- 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)
无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...
- 实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。
软件学院实验报告 姓名: 学号: 专业: 年级: 课程名称 数据结构 实验名称 实验9.图的遍历 实验的准备阶段 实验内 ...
- 图的深度优先搜索和广度优先搜索
一.深度优先搜索(DFS) 每次都在访问完当前节点后首先访问当前节点的第一个邻接节点,可以看出这是一个递归的过程. 深度优先遍历算法步骤: 1.访问初始尾结点v,并标记结点v已经访问 2.查找结点v的 ...
- 二叉树深度优先遍历和广度优先遍历
二叉树深度优先遍历和广度优先遍历
最新文章
- android 获取网卡mac_防亚马逊账号关联黑科技--如何修改我们的网卡MAC到底重要不?...
- rx在c语言中,RxSwift - 入门
- 一、flask的基本使用-flask
- Linux - 系统资源
- OGRE 学习小记 开发环境的配置
- 交叉编译 for arm-linux-gcc... no,QT4.8.6、tslib库移植到arm上配置出错!求大神指点
- qimage加载bmp图片_9个最佳的优化动态gif图片大小的工具
- NoSQL Manager for MongoDB 破解
- jQuery插件开发(转)
- AngularJS Providers 详解
- 安装IIS以及配置ASP.NET流程
- 4 配置端口聚合提供冗余备份链路
- C语言中整型变量四舍五入,怎样将整型变量按四舍五入转换成整数
- tensorflow的数据读取 tf.data.DataSet、tf.data.Iterator
- 利用python来解决 小鸡,公鸡,母鸡的数学问题
- ECBS多机器人路径规划
- 把中文目录名称修改成英文首字母大写或中文拼音目录
- MyBatis基础原理
- Android app内部下载安装
- 20221128-20221202周总结
热门文章
- 《Linux Device Drivers》第十五章 内存映射和DMA——note
- 浅谈EntityFramework框架的使用
- 关于Html中jsp调用Android中方法无效的一点建议
- 【LeetCode】104. Maximum Depth of Binary Tree (2 solutions)
- WebSphere应用程序服务器Web容器设置
- 换光纤猫 ZXA10 F420
- 八部委宰割C类电商 消费者必遭殃
- AC自动机解决字符集很大的情况(可持久化数组优化getfail的过程)
- CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)
- sscanf()函数的用法