// 邻接表存储与广度和深度优先算法
#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

有向图的深度/广度优先遍历算法相关推荐

  1. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

  2. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  3. 广度优先遍历算法-01寻找制高点问题

    寻找制高点 前言 广度优先遍历算法在搜索答案时不像深度优先那样一条路走到底,而是采用由近及远的方式,先访问离起始点最近的所有点,再访问远一些的点.由于这种一层层搜索的策略,又叫做层次遍历算法. 简介 ...

  4. 深度、广度优先遍历算法python

    文章目录 一.深度优先 1.怎么抓住小偷 2.二叉树中的最大路径和 3.最大的岛屿 二.广度优先 1.树的右侧 2.合法的括号 3.寻找制高点 4.选课的智慧 一.深度优先 该篇学习笔记来自于< ...

  5. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

  6. 广度优先遍历算法-02合法的括号问题

    合法的括号 简介 比较基础的BFS题目. 注意,由于要对不合法的字符串最小步数删减为合法的字符串,所以BFS合适. 之所以选择BFS,是因为要返回的结果为删减最小数目的括号后使字符串合法," ...

  7. 基于广度优先遍历算法求采用邻接表存储的无向连通图G中从顶点u到v的最短路径

    问题 假设图G采用邻接表存储,设计一个算法,求不带权无向连通图G中从顶点u->v的最短路径(路径上经过的顶点数最少.采用广度优先遍历来实现. 基本思路 我们首先来看一下BFS的过程: 图片摘自慕 ...

  8. 简述树的深度优先及广度优先遍历算法,并说明非递归实现?

    深度优先遍历二叉树. 1. 中序遍历(LDR)的递归算法: 若二叉树为空,则算法结束:否则: 中序遍历根结点的左子树: 访问根结点: 中序遍历根结点的右子树. 2. 前序遍历(DLR)的递归算法: 若 ...

  9. 图的深度广度优先遍历(DFC与BFC)JavaScript版

    graph.js 创建一个js文件用于表示图这个类型,这个对象的键为节点,所对应的值为这个节点所连接的节点. const graph={0:[1,2],1:[2],2:[0,3],3:[3] }; m ...

最新文章

  1. 通过WiFi对STC单片机程序下载和调试
  2. mysql数据库21_MySQL数据库技术(21)[组图]_MySQL
  3. 第三次学JAVA再学不好就吃翔(part92)--Map集合的遍历
  4. 关于过程和线程的常识点汇总
  5. graph slam tutorial :从推导到应用3
  6. 使用CompletableFuture实现业务服务的异步调用实战代码
  7. 详解|天猫搜索前端技术历代记
  8. Redhat 更换阿里yum源
  9. Opencv 轮廓提取
  10. 计算机网络软件系统不包括,1period;计算机软件系统一般分为lpar; A rpar;两大部分...
  11. VBS 按键 SendKeys:启动应用,执行热键
  12. QQ被盗的自救、事故分析
  13. 飞桨 DNN波士顿房价预测
  14. RecyclerView源码学习笔记(一)构造函数和setLayoutManager方法
  15. Apache OpenNLP介绍(一)
  16. 机器学习分类模型评价指标详述
  17. Android Shortcuts使用详解
  18. 【渝粤题库】陕西师范大学201581 汉英翻译
  19. 实现阿拉伯数字转中文大写
  20. 钉钉机器人怎么用java测试_钉钉机器人工具类

热门文章

  1. go 从入门到精通(二)基本数据类型和操作符
  2. 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现(by 低端码农 2014.10.27)
  3. 区块链数字广告项目-【DadxChain】
  4. JZOJ 5925. 【NOIP2018模拟10.25】naive 的瓶子
  5. layui 自定义排序_thinkphp5+layui异步修改排序
  6. server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...
  7. android 动态移动xy,android – 如何使用AChartEngine动态线图和X轴自动平移(滚动)?...
  8. anaconda tensorflow 2.3_2020款福特撼路者将于7月17日上市 动力升级/搭载2.3T+10AT
  9. 11无监听程序_腾讯开心鼠英语 小程序实践与总结
  10. 矩阵运算和文本处理中的分类问题