前面我们已经说了很多基本的数据结构,比如说线性表、栈、队列、串、树;有兴趣的朋友可以去我的博客看看,今天我们来说说最后一种数据结构:图。
图的定义
在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。这和一对父母可以有多个孩子,但每个孩子却只能有一对父母是一个道理。可现实中,人与人之间关系就非常复杂,比如我认识的朋友,可能他们之间也互相认识, 这就不是简单的一对一、一对多,研究人际关系很自然会考虑多对多的情况。那就是我们今天要研究的主题——图。图是一种较线性表和树更加复杂的数据结构。在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。
前面朋友可能觉得树的术语好多,可来到了图,你就知道, 什么才叫做真正的术语多。不过术语再多也是有规律可遁的,让我们开始“ 图 ”世界的旅程。如下图所示,先来看定义。
图( Graph )是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G (V,E ),其中, G 表示一个图, V 是图 G 中顶点的集合, E 是图 G 中边的集会。
对于图的定义,我们需要明确几个注意的地方。
• 线性表中我们把数据元素叫元素,树中将数据元素叫结点 ,在图中数据元素,我们则称之为顶点 (Vertex) 。
• 线性表中可以没有数据元素,称为空表。树中可以没有结点,叫做空树。 那么对于图呢?在图结构中,不允许没有顶点。在定义中,若 V 是顶点的集合,则强调了顶点集合V有穷非空。
• 线性表中,相邻的数据元素之间具有线性关系,树结构中,相邻两层的结点具有层次关系,而图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。
各种图定义
无向边:若顶点 Vi 到 Vj 之间的边没有方向,则称这条边为无向边 (Edge) ,用无序偶对 (Vi,Vj) 来表示。如果图中任意两个顶点之间的边都是无向边,则称该图为无向图 (Undirected graphs)。下图左边就是一个无向图,由于是无方向的,连接顶点 A 与 D 的边,可以表示无序队列(A,D),也可以写成 (D,A)。
对于下图中的无向图 G1 来说, G1= (V1,{ E1 }),其中顶点集合 V1={ A,B,C,D }; 边集合 E1={ (A,B) ,(B,C) , (C,D), ( D,A) , (A,C) }
有向边:若从顶点 Vi 到 Vj 的边有方向,则称这条边为有向边,也称为弧( Arc )。
用有序偶<Vi,Vj>来表示. Vi 称为弧尾 (Tail) , Vj