第七十四课 图的遍历(BFS)

广度优先相当于对顶点进行分层,层次遍历。

在Graph.h中添加BFS函数:

  1 #ifndef GRAPH_H
  2 #define GRAPH_H
  3
  4 #include "Object.h"
  5 #include "SharedPointer.h"
  6 #include "Array.h"
  7 #include "DynamicArray.h"
  8 #include "LinkQueue.h"
  9
 10 namespace DTLib
 11 {
 12
 13 template < typename E >
 14 struct Edge : public Object
 15 {
 16     int b;
 17     int e;
 18     E data;
 19
 20     Edge(int i=-1, int j=-1)
 21     {
 22         b = i;
 23         e = j;
 24     }
 25
 26     Edge(int i, int j, const E& value)
 27     {
 28         b = i;
 29         e = j;
 30         data = value;
 31     }
 32
 33     bool operator == (const Edge<E>& obj)
 34     {
 35         return (b == obj.b) && (e == obj.e);  //在这里不关注权值大小
 36     }
 37
 38     bool operator != (const Edge<E>& obj)
 39     {
 40         return !(*this == obj);
 41     }
 42 };
 43
 44 template < typename V, typename E >
 45 class Graph : public Object
 46 {
 47 protected:
 48     template < typename T >
 49     DynamicArray<T>* toArray(LinkQueue<T>& queue)
 50     {
 51         DynamicArray<T>* ret = new DynamicArray<T>(queue.length());
 52
 53         if( ret != NULL )
 54         {
 55             for(int i=0; i<ret->length(); i++, queue.remove())
 56             {
 57                 ret->set(i, queue.front());
 58             }
 59         }
 60         else
 61         {
 62             THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create ret object...");
 63         }
 64
 65         return ret;
 66     }
 67 public:
 68     virtual V getVertex(int i) = 0;
 69     virtual bool getVertex(int i, V& value) = 0;
 70     virtual bool setVertex(int i, const V& value) = 0;
 71     virtual SharedPointer< Array<int> > getAdjacent(int i) = 0;
 72     virtual E getEdge(int i, int j) = 0;
 73     virtual bool getEdge(int i, int j, E& value) = 0;
 74     virtual bool setEdge(int i, int j, const E& value) = 0;
 75     virtual bool removeEdge(int i, int j) = 0;
 76     virtual int vCount() = 0;
 77     virtual int eCount() = 0;
 78     virtual int OD(int i) = 0;
 79     virtual int ID(int i) = 0;
 80     virtual int TD(int i)
 81     {
 82         return ID(i) + OD(i);
 83     }
 84
 85     SharedPointer< Array<int> > BFS(int i)
 86     {
 87         DynamicArray<int>* ret = NULL;
 88
 89         if( (0 <= i) && (i < vCount()) )
 90         {
 91             LinkQueue<int> q;
 92             LinkQueue<int> r;
 93             DynamicArray<bool> visited(vCount());
 94
 95             for(int i=0; i<visited.length(); i++)
 96             {
 97                 visited[i] = false;
 98             }
 99
100             q.add(i);
101
102             while( q.length() > 0 )
103             {
104                 int v = q.front();
105
106                 q.remove();
107
108                 if( !visited[v] )
109                 {
110                     SharedPointer< Array<int> > aj = getAdjacent(v);
111
112                     for(int j=0; j<aj->length(); j++)
113                     {
114                         q.add((*aj)[j]);
115                     }
116
117                     r.add(v);
118
119                     visited[v] = true;
120                 }
121             }
122
123             ret = toArray(r);
124         }
125         else
126         {
127             THROW_EXCEPTION(InvalidParameterException, "Index i is invalid...");
128         }
129
130         return ret;
131     }
132 };
133
134 }
135
136 #endif // GRAPH_H

测试程序如下:

 1 #include <iostream>
 2 #include "BTreeNode.h"
 3 #include "ListGraph.h"
 4 #include "MatrixGraph.h"
 5
 6 using namespace std;
 7 using namespace DTLib;
 8
 9
10 int main()
11 {
12     MatrixGraph<9, char, int> g;
13     const char* VD = "ABEDCGFHI";
14
15     for(int i=0; i<9; i++)
16     {
17         g.setVertex(0, VD[i]);
18     }
19
20     g.setEdge(0, 1, 0);
21     g.setEdge(1, 0, 0);
22
23     g.setEdge(0, 3, 0);
24     g.setEdge(3, 0, 0);
25
26     g.setEdge(0, 4, 0);
27     g.setEdge(4, 0, 0);
28
29     g.setEdge(1, 2, 0);
30     g.setEdge(2, 1, 0);
31
32     g.setEdge(1, 4, 0);
33     g.setEdge(4, 1, 0);
34
35     g.setEdge(2, 5, 0);
36     g.setEdge(5, 2, 0);
37
38     g.setEdge(3, 6, 0);
39     g.setEdge(6, 3, 0);
40
41     g.setEdge(4, 6, 0);
42     g.setEdge(6, 4, 0);
43
44     g.setEdge(6, 7, 0);
45     g.setEdge(7, 6, 0);
46
47     g.setEdge(7, 8, 0);
48     g.setEdge(8, 7, 0);
49
50     SharedPointer< Array<int> > sa = g.BFS(0);
51
52     for(int i=0; i<sa->length(); i++)
53     {
54         cout << (*sa)[i] << " ";
55     }
56
57     cout << endl;
58
59     return 0;
60 }

广度优先的本质就是层次遍历。

结果如下:

小结:

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9716123.html

时间: 2024-11-05 22:05:58

第七十四课 图的遍历(BFS)的相关文章

第七十四课、多线程间的同步

一.多线程间的同步 1.多线程编程的本质 (1).并发性是多线程编程的本质 (2).在宏观上,所有线程并行执行 (3).多个线程间相互独立,互不干涉 2.特殊情况下,多线程存在依赖 煮菜和煮饭这两个线程结束后,才能进行吃饭的线程 3.同步的概念 (1).在特殊情况下,控制多线程间的相对执行顺序 (2).QThread类支持线程间的同步 #include <QCoreApplication> #include <QThread> #include <QDebug> /*

第七十二课 图的存储结构(上)

顶点和数据元素相关联: 每个顶点关联着一个字符串,这个就是顶点的数据,这个数据关联着工程意义. 添加MatrixGraph.h文件: 1 #ifndef MATRIXGRAPH_H 2 #define MATRIXGRAPH_H 3 4 #include "Graph.h" 5 #include "Exception.h" 6 #include "DynamicArray.h" 7 8 namespace DTLib 9 { 10 // V是顶点

NeHe OpenGL教程 第四十四课:3D光晕

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十四课:3D光晕 3D 光晕 当镜头对准太阳的时候就会出现这种效果,模拟它非常的简单,一点数学和纹理贴图就够了.好好看看吧. 大家好,欢迎来到新的一课,在这一课中我们将扩展glCamera类,来实现镜头光晕的效果.在日常生活中,

第三十四课 二维数组的存储 【项目1-3】

第三十四课 二维数组的存储 项目一[二维数组当函数参数] 定义一个函数来完成对参数数组中元素的求和工作,函数声明如下: [cpp] view plain copy print? int sum(int array[ ][4],int m,int n);  //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. [cpp] view plain copy print? #include <stdio.h> int sum(int array[ ][4

NeHe OpenGL教程 第十四课:图形字体

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第十四课:图形字体 图形字体: 在一课我们将教你绘制3D的图形字体,它们可像一般的3D模型一样被变换. 这节课继续上一节课课的内容.在第13课我们学习了如何使用位图字体,这节课,我们将学习如何使用轮廓字体. 创建轮廓字体的方法类似于

Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗、嗅探、dns欺骗、session劫持

Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗.嗅探.dns欺骗.session劫持 文/玄魂 目录 Kali Linux Web 渗透测试—第十四课-arp欺骗.嗅探.dns欺骗.session劫持      1 关于嗅探.arp欺骗.会话劫持.............................................................. 1 视频教程地址:http://edu.51cto.com/course/course_id-1887.h

第二十四课:能量和功率

1.RC电路充电过程的能量特性: 电源提供的能量  Vs i 在T内积分 如果T远远大于时间常数,则该能量等于 CVs2 但是电容储存的能量等于 (1/2) CVs2 因此一半能量被电阻消耗,另一半则被电容储存起来 2.RC电路放电过程的能量特性: 所以能量消耗在电阻上 3.将两个过程相连,则电源消耗CVs2,一般在充电时消耗,一般在放电时消耗 因此平均功率等于 CVs2f   ,f是充放电的切换频率,愈大功率越大 4.类似于MODFET反相电路 两种功率之和:待机功率和动态功率,后者就是充放电

OpenGL教程翻译 第十四课 相机控制(一)

OpenGL教程翻译 第十四课 相机控制(一) 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) Background 在之前的教程中我们学习了如何在三维场景中的任何地方放置相机.那么我们下一步就应该学着去控制这个相机.相机可以向任何方向自由移动.我们可以用鼠标和键盘控制相机--鼠标控制视口方向,键盘控制我们的位置.这些都和第一人称视角相似.这一章我们主要来学习鼠标和键盘的控制. 我们仍然使用上下左右四个方向键.记住,我们的相机的变换取决于位置.targ

七十四、expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统、

七十四.expect脚本同步文件.expect脚本指定host和要同步的文件.构建文件分发系统.批量远程执行命令 一.expect脚本同步文件 自动同步文件,在一台机器上同步文件到另一台机器上去.核心命令是rsync [[email protected] sbin]# vim 4.expect     路径:/usr/local/sbin/ #!/usr/bin/expect set passwd "1346" spawn rsync -av [email protected]:/tm