图的数据结构的实现与遍历(DFS,BFS)
//图的存储结构:
const int MAXSIZE = 10;
//邻接矩阵
template<class T>
class MGraph {
public:
MGraph(T a[], int n, int e);
void DFS(int v);
void BFS(int v);
private: //edge为边用来表示无向图,arc为弧用来表示有向图,vertex为顶点
T vertex[MAXSIZE];
int arc[MAXSIZE][MAXSIZE];
int edge[MAXSIZE][MAXSIZE];
int vNum, arcNum,eNum;
bool* visited; //DFS使用
};
template<class T>
MGraph<T>::MGraph(T a[], int v, int e) { //n为顶点个数,e为边的个数,a[]为各顶点值
vNum = v; //将顶点个数,边个数,顶点值放入类中属性
arcNum = e;
visited = new bool[v];
memset(visited, false, sizeof(bool) * v);
for (int k = 0; k < v; k++) {
vertex[k] = a[k];
}
for (int k = 0; k < v; k++) { //先将邻接矩阵初始化
for (int j = 0; j < v; j++) {
arc[k][j] = 0;
}
}
for (int k = 0,i=0,j=0; k < e; k++) { //这里是无向图的邻接矩阵,输入相连的两个顶点
cin >> i >> j;
arc[j-1][i-1] = arc[i-1][j-1] = 1;
}
}
//邻接表,同样以无向图为例,边用arc表示
struct ArcNode { //边的数据结构,存储边信息和下一条边
int adjvex; //相邻的顶点
ArcNode* nextarc;
};
struct VertexNode { //顶点的数据结构,存储顶点信息和下一条边
int vertex;
ArcNode* firstarc;
};
template<class T>
class ALGraph {
public:
ALGraph(T a[], int n, int e);
//~ALGraph();
void DFS(int v);
void BFS(int v);
private:
VertexNode adjlist[MAXSIZE];
int vNum, arcNum;
bool* visited;
};
template<class T>
ALGraph<T>::ALGraph(T a[], int v, int e) {
vNum = v;
arcNum = e;
visited = new bool[v];
memset(visited, false, sizeof(bool) * v);
for (int i = 0; i < v; i++) { //对顶点表进行初始化
adjlist[i].vertex = a[i];
adjlist[i].firstarc = NULL;
}
for (int k = 0,i=0,j=0; k < e; k++) { //这里是无向图,如果有向图的话,则为顶点i指向j
cin >> i >> j; //注意这里的e是每个顶点连接的边的总和,将无向看成有双箭头的有向(实际不适合表示无向图)
ArcNode* s = new ArcNode;
s->adjvex = j; //这里使用的是头插入法
s->nextarc = adjlist[i-1].firstarc;
adjlist[i-1].firstarc = s;
}
}
//补充:邻接表适合表示有向图,还有一种逆邻接表表示法,与邻接表的出为指向方向相反,逆邻接表类似于入边表
//十字链表,只提供节点的存储结构
struct VertexNodeC {
int Vertex;
ArcNode* firstin;
ArcNode* firstout;
};
struct ArcNodeC {
int headvex,tailvex;
ArcNode* hlink;
};
//边集数组,比较常用,使用两个一维数组存储,一个数组存储顶点,一个数组存储起点,终点,权值
struct ArcNodeE {
int headvex;
int tailvex;
int weight;
};
//图的遍历:DFS与BFS
//DFS深度优先搜索,类似于二叉树的前序遍历,先从一条支路到结尾,然后一步步回溯寻找还未访问过的节点
//邻接矩阵和邻接表两种存储结构的dfs
//两种存储结构的dfs比较
//邻接矩阵的时间复杂度 n
//邻接表的时间复杂度 n+e 栈深度 n 空间复杂度 n
template<class T>
void MGraph<T>::DFS(int v) {
cout << vertex[v];
visited[v] = true; //将访问过的顶点标记为访问过
for (int j = 0; j < vNum; j++) { //按照邻接矩阵的特性,根据标记来深入搜索
if (arc[v][j] == 1 && visited[j] == false) {
DFS(j);
}
}
}
template<class T>
void ALGraph<T>::DFS(int v) { //根据邻接表的连接,从顶点第一个边节点转为顶点节点,并标记是否访问,然后一步步回溯看是否有未访问的相邻节点
cout << adjlist[v].vertex;
visited[v] = true;
ArcNode* p = adjlist[v].firstarc;
while (p) {
if (visited[p->adjvex] == false) {
DFS(p->adjvex);
}
p = p->nextarc;
}
}
//BFS广度优先搜索,类似于树的层序遍历,使用队列逻辑结构
//分别用邻接矩阵和邻接表描述
//邻接矩阵时间复杂度 n
//邻接表时间复杂度 n+e 空间复杂度 n
template<class T>
void MGraph<T>::BFS(int v) {
int queue[MAXSIZE];
int f = 0, r = 0;
cout << vertex[v];
visited[v] = true;
queue[++r] = v;
while (f != r) { //当头尾相等时队列为空,表示队列为空
v = queue[++f];
for (int j = 0; j < vNum; j++) {
if (arc[v][j] == 1 && visited[j] == false) {
cout << vertex[j];
visited[j] = true;
queue[++r] = j;
}
}
}
}
template<class T>
void ALGraph<T>::BFS(int v) {
int queue[MAXSIZE];
int f = 0, r = 0;
cout << adjlist[v].vertex;
visited[v] = true;
queue[++r] = v;
while (r!=f) {
v = queue[++f];
ArcNode *p = adjlist[v].firstarc;
while (p) {
int j = p->adjvex;
if (visited[j] == false) {
cout << adjlist[j].vertex;
visited[j] = true;
queue[++r] = j;
}
p = p->nextarc;
}
}
}
关于图的4中基本算法放在单独一篇,Prim,Kruskal,Floyd,Dijkstra
图的数据结构的实现与遍历(DFS,BFS)的更多相关文章
- 图的遍历[DFS][BFS]
#include<iostream> #include<iostream> #include<cstring> #include<queue> #inc ...
- 列出连通集(DFS及BFS遍历图) -- 数据结构
题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...
- 图的两种遍历:DFS&BFS
DFS和BFS在图中的应用: 图连通性判定:路径的存在性:图中是否存在环:求图的最小生成树:求图的关键路径:求图的拓扑排序. DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走 ...
- 图的遍历——DFS和BFS模板(一般的图)
关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]
题目 One way that the police finds the head of a gang is to check people's phone calls. If there is a ...
- 图的遍历DFS
图的遍历DFS 与树的深度优先遍历之间的联系 树的深度优先遍历分为:先根,后根 //树的先根遍历 void PreOrder(TreeNode *R){ if(R!=NULL){ visit(R); ...
- 算法学习记录-图(DFS BFS)
图: 目录: 1.概念 2.邻接矩阵(结构,深度/广度优先遍历) 3.邻接表(结构,深度/广度优先遍历) 图的基本概念: 数据元素:顶点 1.有穷非空(必须有顶点) 2.顶点之间为边(可空) 无向图: ...
随机推荐
- 吴裕雄--天生自然Numpy库学习笔记:NumPy Matplotlib
Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 PyQt 和 wxPython. W ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 算术函数
NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide(). 需要注意的是数组必须具有相同的形状或符合数组广播规则. import nump ...
- Kindle阅读产品体验报告-随时随地畅享阅读
产品入门-第一份产品体验报告Kindle阅读-随时随地畅享阅读时间:2018/11/18-11/22 Kindle阅读 一.产品概括 (1)体验环境 机型:荣耀8 系统:EMUI 8.0(Andr ...
- 软件版本 Alpha、Beta、Rc
软件版本的周期 α.β.γ 表示软件测试中的三个阶段 α :第一阶段,内部测试使用 β: 第二阶段,消除了大部分不完善的地方,仍可能存在漏洞,一般提供给特定的用户使用 γ: 第三阶段,产品成熟,个别地 ...
- jQuery结合CSS实现手风琴组件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Codeforces Round #616 (Div. 2) D
莫队的模板 struct node{ int l,r,id; }q[maxn]; int cmp(node a,node b) { ) ? a.r < b.r : a.r > b.r); ...
- 静态成员、final成员、面向对象接口
静态成员 静态属性定义时在访问控制关键字后面加static 在类定义中使用静态成员的时候,用self关键字后面跟着::操作符,在访问静态成员的时候::后面需要跟$符号 在类定义外部访问静态属性,用类名 ...
- [Unity] Shader Graph Error 当前渲染管道与此主节点不兼容(The current render pipeline is not compatible with this master node)
Shader Graph Error : The current render pipeline is not compatible with this master node 问题产生环境: Un ...
- ZooKeeper 相关知识
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zhang123456456/articl ...
- 02使用GitHub远程仓库
一.远程库配置 由于本地的GIT仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要以下配置: 1.创建SSH key 为什么GitHub需要SSHKey:根据key来授权,有哪些key可以往 ...