有向图的深度/广度优先遍历算法
// 邻接表存储与广度和深度优先算法
#include <iostream>
using namespace std;
#define MAX_VERTEX_NUM 100
typedef enum {
DG,DN,UDG,UDN
}GraphKind;
typedef struct EdgeNode {
int adjvex; // 存储邻接点在顶点中的位置
struct EdgeNode *nextedge;
int weight;
}EdgeNode;
typedef struct VexNode {
char vex;
EdgeNode *firstedge;
}VexNode;
typedef struct {
VexNode vexs[MAX_VERTEX_NUM];
int vexnum, edgenum;
GraphKind kind;
}LGraph;
// 构造有向图的邻接表,顶点数n,边数 e
void CreateDG(LGraph &G, int n, int e) {
char ch;
int i, j;
G.vexnum = n;
G.edgenum = e;
// 顶点信息初始化
for (i = 0; i < n; i++) {
cin >> ch;
G.vexs[i].vex = ch;
G.vexs[i].firstedge = NULL;
}
// 边的信息初始化
for (int k = 0; k < e; k++) {
cin >> i >> j;
EdgeNode *p = new EdgeNode;
p->adjvex = j;
p->nextedge = G.vexs[i].firstedge;
G.vexs[i].firstedge = p; // 采用头插法来构建
}
}
// 有向图的深度优先算法
int visited[MAX_VERTEX_NUM];
void DFS(LGraph &G, int i) {
visited[i] = 1;
cout << G.vexs[i].vex << " ";
int j; // 当前访问的节点信息
EdgeNode *p;
p = G.vexs[i].firstedge;
while (p) {
j = p->adjvex;
if (!visited[j]) {
DFS(G, j);
}
p = p->nextedge;
}
}
void DFS_Traverse(LGraph &G) {
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFS(G, i);
}
}
}
// 有向图的广度优先遍历
const int Queue_Size = 100;
typedef struct circlQueue {
int *elem;
int front, rear;
int queueSize;
}circlQueue;
// 循环队列初始化
void init_circleQueue(circlQueue &Q) {
Q.elem = new int[Queue_Size];
Q.front = Q.rear = 0;
Q.queueSize = Queue_Size;
}
// 入队列
void enterQueue(circlQueue &Q, int x) {
// 判满
if ((Q.rear + 1)%Q.queueSize == Q.front) {
cout << "Queue OverFlow!" << endl;
}
Q.elem[Q.rear] = x;
Q.rear = (Q.rear + 1) % Q.queueSize;
}
// 出队列
void outQueue(circlQueue &Q, int &e) {
// 判空
if (Q.front == Q.rear) {
cout << "Queue Empty!" << endl;
}
e = Q.elem[Q.front];
Q.front = (Q.front + 1) % Q.queueSize;
}
// 广度优先
void BFS_Traverse(LGraph &G) {
for (int i = 0; i < G.vexnum; i++)
visited[i] = 0;
circlQueue Q;
init_circleQueue(Q);
int v1,v2;
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
visited[i] = 1;
cout << G.vexs[i].vex << " ";
enterQueue(Q, i);
// 队列不空
while (Q.rear != Q.front) {
outQueue(Q, v1);
EdgeNode *p;
p = G.vexs[v1].firstedge;
while(p){
v2 = p->adjvex;
if (!visited[v2]) {
cout << G.vexs[v2].vex << " ";
visited[v2] = 1;
enterQueue(Q, v2);
}
p = p->nextedge;
}
}
}
}
}
int main() {
LGraph G;
int n, e;
cout << "请输入顶点数目:" << endl;
cin >> n;
cout << "请输入边的数目:" << endl;
cin >> e;
CreateDG(G, n, e);
cout << "深度优先搜索结果:" << endl;
DFS_Traverse(G);
cout << endl;
cout << "广度优先搜索结果:" << endl;
BFS_Traverse(G);
system("pause");
return 0;
}
转载于:https://www.cnblogs.com/codingtao/p/6430429.html
有向图的深度/广度优先遍历算法相关推荐
- 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...
- 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...
- 广度优先遍历算法-01寻找制高点问题
寻找制高点 前言 广度优先遍历算法在搜索答案时不像深度优先那样一条路走到底,而是采用由近及远的方式,先访问离起始点最近的所有点,再访问远一些的点.由于这种一层层搜索的策略,又叫做层次遍历算法. 简介 ...
- 深度、广度优先遍历算法python
文章目录 一.深度优先 1.怎么抓住小偷 2.二叉树中的最大路径和 3.最大的岛屿 二.广度优先 1.树的右侧 2.合法的括号 3.寻找制高点 4.选课的智慧 一.深度优先 该篇学习笔记来自于< ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- 广度优先遍历算法-02合法的括号问题
合法的括号 简介 比较基础的BFS题目. 注意,由于要对不合法的字符串最小步数删减为合法的字符串,所以BFS合适. 之所以选择BFS,是因为要返回的结果为删减最小数目的括号后使字符串合法," ...
- 基于广度优先遍历算法求采用邻接表存储的无向连通图G中从顶点u到v的最短路径
问题 假设图G采用邻接表存储,设计一个算法,求不带权无向连通图G中从顶点u->v的最短路径(路径上经过的顶点数最少.采用广度优先遍历来实现. 基本思路 我们首先来看一下BFS的过程: 图片摘自慕 ...
- 简述树的深度优先及广度优先遍历算法,并说明非递归实现?
深度优先遍历二叉树. 1. 中序遍历(LDR)的递归算法: 若二叉树为空,则算法结束:否则: 中序遍历根结点的左子树: 访问根结点: 中序遍历根结点的右子树. 2. 前序遍历(DLR)的递归算法: 若 ...
- 图的深度广度优先遍历(DFC与BFC)JavaScript版
graph.js 创建一个js文件用于表示图这个类型,这个对象的键为节点,所对应的值为这个节点所连接的节点. const graph={0:[1,2],1:[2],2:[0,3],3:[3] }; m ...
最新文章
- 通过WiFi对STC单片机程序下载和调试
- mysql数据库21_MySQL数据库技术(21)[组图]_MySQL
- 第三次学JAVA再学不好就吃翔(part92)--Map集合的遍历
- 关于过程和线程的常识点汇总
- graph slam tutorial :从推导到应用3
- 使用CompletableFuture实现业务服务的异步调用实战代码
- 详解|天猫搜索前端技术历代记
- Redhat 更换阿里yum源
- Opencv 轮廓提取
- 计算机网络软件系统不包括,1period;计算机软件系统一般分为lpar; A rpar;两大部分...
- VBS 按键 SendKeys:启动应用,执行热键
- QQ被盗的自救、事故分析
- 飞桨 DNN波士顿房价预测
- RecyclerView源码学习笔记(一)构造函数和setLayoutManager方法
- Apache OpenNLP介绍(一)
- 机器学习分类模型评价指标详述
- Android Shortcuts使用详解
- 【渝粤题库】陕西师范大学201581 汉英翻译
- 实现阿拉伯数字转中文大写
- 钉钉机器人怎么用java测试_钉钉机器人工具类
热门文章
- go 从入门到精通(二)基本数据类型和操作符
- 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现(by 低端码农 2014.10.27)
- 区块链数字广告项目-【DadxChain】
- JZOJ 5925. 【NOIP2018模拟10.25】naive 的瓶子
- layui 自定义排序_thinkphp5+layui异步修改排序
- server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...
- android 动态移动xy,android – 如何使用AChartEngine动态线图和X轴自动平移(滚动)?...
- anaconda tensorflow 2.3_2020款福特撼路者将于7月17日上市 动力升级/搭载2.3T+10AT
- 11无监听程序_腾讯开心鼠英语 小程序实践与总结
- 矩阵运算和文本处理中的分类问题