图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。

0_12849822668MW5
在上面两个图结构中,一个是有向图,即每条边都有方向,另一个是无向图,即每条边都没有方向。
在有向图中,通常将边称作弧,含箭头的一端称为弧头,另一端称为弧尾,记作<vi,vj>,它表示从顶点vi到顶点vj有一条边。

稀疏图与稠密图

有很少条边或弧(如e<nlogn,n是图的顶点数,e是弧数)的图称为稀疏图(sparse graph),反之成为稠密图(dense graph)。

数据结构

要表示一个图G=(V,E),有两种标准的方法,即邻接表和邻接矩阵。

邻接矩阵

邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
我们来看一个实例,下图就是一个无向图
Dingtalk_20211116162342
有向网图
Dingtalk_20211116162342

邻接表

邻接表作为图的一种存储方式,在存储稀疏图上相对于邻接矩阵有相当大的空间节省。如一个稀疏图的顶点个个数为n,边数为e。用邻接矩阵存储需要n^2空间,而真正进行存储的只有2e个空间, 剩下的n^2-2e都浪费了。但是对于邻接表来讲,存储空间只需要n+2e个,相对于邻接矩阵减少了很多。邻接表虽然在空间上有很大的优势,但是对于一个有向图,如果需要查找每个顶点的入度就需要遍历整个邻接表,在效率上很低下的。因此才有了逆邻接表的诞生。
邻接表:反映的是顶点出度的情况。
逆邻接表:反映的是顶点的入度情况。

下面举一个例子:
20191122211916187
邻接表:
20191122211916187

逆邻接表:
20191122211916187

make是一条计算机指令,是在安装有GNU Make的计算机上的可执行指令。该指令是读入一个名为makefile的文件,然后执行这个文件中指定的指令。

阅读全文 »

配接器在STL组件的灵活组合运用功能上,扮演着轴承、转换器的角色。Adaper这个概念,事实上是一种设计模式。在《设计模式》中adapter定义如下:将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作。

阅读全文 »

仿函数其实上就是一个“行为类似函数”的对象。仿函数可以让STL算法有更灵活的演出。
c++11中已经引入lamda表达式,相当于将这部分内容加入了语法。

阅读全文 »

广义而言,我们所写的每个程序都是一个算法,其中的每个函数也都是一个算法,毕竟它们都用来解决或大或小的逻辑问题或数学问题。
STL算法包括排序、查找、排列组合算法,以及用于数据移动、复制、删除、比较、组合、运算等等。

阅读全文 »