c++图的广度优先遍历和深度优先遍历
BFS.h
#pragma once
//广度优先遍历
#include"Graph.h"
#include<queue>
#include<iostream>
vector<Node*>BFS(Graph graph, int start)
{vector<Node*>res;unordered_set<Node*>marked;//标记集合queue<Node*>que;//将起始点放入到队列中并且添加标记que.push(graph.nodes[start]);marked.insert(graph.nodes[start]);while (!que.empty()){//弹出队列的首元素并且放入结果集中或者直接打印Node* front = que.front();que.pop();cout << (char)front->val << " ";res.push_back(front);for (int i = 0; i < front->next.size(); i++){if (marked.find(front->next[i]) == marked.end()){que.push(front->next[i]);marked.insert(front->next[i]);}}}return res;
}
DFS.h
#pragma once
#include"Graph.h"
#include<stack>
#include<iostream>
void DFS(Graph graph, int start)
{unordered_set<Node*>marked;stack<Node*>stk;//把起始点放入栈中并且加入标记集合stk.push(graph.nodes[start]);marked.insert(graph.nodes[start]);while (!stk.empty()){//弹出栈顶元素,并且加入到结果集中Node* top = stk.top();stk.pop();cout << (char)top->val << " ";//遍历邻接点,如果邻接点没有被标记,放入栈汇中并且做好标记for (int i = 0; i < top->next.size(); i++){if (marked.find(top->next[i]) == marked.end()){stk.push(top->next[i]);marked.insert(top->next[i]);}}}
}
Graph.h
#pragma once
#include<vector>
#include<unordered_map>
#include<unordered_set>
using namespace std;
struct Edge;
struct Node
{int val;int out;int in;vector<Node*>next;Node(int val){this->val = val;in = 0;out = 0;}
};
struct Edge {Node* from;Node* to;int weight;Edge(int w, Node* f, Node* t){weight = w;from = f;to = t;}
};
class Graph
{
public:unordered_map<int, Node*> nodes;unordered_set<Edge *>edges;Graph(vector<vector<int>>);
};
Graph.cpp
#include"Graph.h"
Graph::Graph(vector<vector<int>> vec)
{for (int i = 0; i < vec.size(); i++){int from = vec[i][0];//入边的valint to = vec[i][1];//出边的valint weight = vec[i][2];//边的权重if (nodes.find(from) == nodes.end()){Node* node = new Node(from);nodes[from] = node;}if (nodes.find(to) == nodes.end()){Node* node = new Node(to);nodes[to] = node;}//创建边Node* nodeFrom = nodes[from];//获取入边Node* nodeTo = nodes[to];//获取出边//根据点初始化边Edge* edge = new Edge(weight, nodeFrom, nodeTo);//把边加入边集edges.insert(edge);nodeFrom->out++;//入边 出度++nodeTo->in++;//出边 入度++nodeFrom->next.push_back(nodeTo);//出边是入边的邻接点}
}
main.cpp
#include"DFS.h"
#include"BFS.h"
int main()
{vector<vector<int>> vec = {{'A','B',12},{'B','A',12},{'A','F',16},{'F','A',16},{'A','G',14},{'G','A',14},{'B','C',10},{'C','B',10},{'B','F',7},{'F','B',7},{'C','F',6},{'F','C',6},{'C','D',3},{'D','C',3},{'C','E',5},{'E','C',5},{'D','E',4},{'E','D',4},{'E','F',2},{'F','E',2},{'E','G',8},{'G','E',8},{'F','G',9},{'G','F',9}};Graph g(vec);BFS(g, vec[0][0]);cout << endl;DFS(g, vec[0][0]);
}
上为BFS,下为DFS
c++图的广度优先遍历和深度优先遍历相关推荐
- 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)
目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...
- 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现
遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...
- python 遍历_python实现图广度优先遍历、深度优先遍历
一.广度优先遍历-BFS 顾名思义,BFS总是先访问完同一层的结点,然后才继续访问下一层结点,它最有用的性质是可以遍历一次就生成中心结点到所遍历结点的最短路径,这一点在求无权图的最短路径时非常有用.广 ...
- 数据结构之图的遍历:深度优先遍历(DFS)
图的遍历:深度优先遍历 思维导图: 深度优先遍历的原理: 深度优先遍历的代码实现: 深度优先遍历的性能: 深度优先生成树: 遍历与连通性的关系: 思维导图: 深度优先遍历的原理: ps: 实现方法是递 ...
- 【数据结构】图-图的遍历_深度优先遍历(动态图解、c++、java)
文章目录 一.概述 二.深度优先搜索 算法步骤 递归 非递归 图解 BFS树 代码 邻接矩阵实现 邻接表实现 链式前向星实现 三.完整代码 邻接矩阵版 邻接表版 链式前向星版 四.总结 算法复杂度分析 ...
- java队列遍历多叉树_多叉树的设计、建立、层次优先遍历和深度优先遍历.pdf
多叉树的设计.建立.层次优先遍历和深度优先遍历 钦 锑 垂 辈 戏 拜 屡 枫 株 冠 镁 障 窘 填 夯 踞 猎 付 管 泽 浓 蚊 涟 瞬 麓 屠 骋 魏 纱 届 糯 孕 永 各 尔 驴 颐 橙 ...
- java 图的邻接矩阵表示,深度优先遍历,广度优先遍历
转载:http://blog.csdn.net/yxmmao/article/details/51586540 1 . 创建图的邻接矩阵数据结构 public class MGraph {/*图的邻接 ...
- 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解
邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
一.图的表示 图G=(V,E).要表示一个图,通常有两种方法:邻接表和邻接矩阵.两种方法都既可以表示有向图,也可以表示无向图. 邻接表表示由一个包含|V|个列表的数组组成,其中每个列表对应V中的一个顶 ...
- 图的广度优先遍历和深度优先遍历
图是一种很重要的数据结构,在我们的编程生活中应用极其广泛 1 #include <iostream> 2 using namespace std; 3 #define INFINITY 3 ...
最新文章
- python type创建类_Python基于内置函数type创建新类型
- html校验长度为9位,2018记一次前端面试笔试考题一
- 一次字节面试,被二叉树的层序遍历捏爆了
- 怪物刷新时间计时_热血传奇;散人对这类怪物可谓是情有独钟
- linux c之通过管道实现兄弟间进程通信:
- freemarker判断是否为空
- flutter GridView 九宫格
- inkscape使用_如何用Inkscape制作万圣节灯笼
- fps游戏 三角函数+模拟
- PCA(主成分分析)的简单理解
- 【2020牛客寒假基础算法训练营】第二场总结
- 【渝粤题库】国家开放大学2021春2251团体工作题目
- 新手阿里云服务器操作指南(图文教程)
- java heap space默认值_java heap space
- 计算机右键括号内的字母,电脑操作中菜单后面括号里的字母的介绍
- 使用Andriod Device Moniter时用正则表达式筛选指定日志
- RDS-TMC(Traffic Message Channel)蕴藏的商机不可小视
- 《操作系统》学习笔记|6.6外存空间管理
- 三种显色方法ECL、NBT/BCIP和DAB的对比
- vue项目H5调起高德或百度地图手机应用,或调起高德百度网页版实现导航功能(已实现)
热门文章
- html,jsp和js的区别
- AttributeError: module ‘platform‘ has no attribute ‘linux_distribution‘
- 初探Web客户端追踪技术
- 整理I 精选微软等公司数据结构+算法面试100题 第1-40题
- 华为公司董事陈黎芳:我们是一个“三无企业”
- opencv 移植到迅为IMX6开发板
- 自由软件日-自由、开放amp;DIY
- 6_HT32F52352按键控制
- MICCAI 2023 肝脏病变诊断挑战赛 (奖金丰厚)
- 菲涅尔公式实现边缘光效果