图的定义
背景知识
看到这篇博客相信一开始映入读者眼帘的就是下面这幅图了,这就是传说中的七桥问题(哥尼斯堡桥问题)。在哥尼斯堡,普雷格尔河环绕着奈佛夫岛(图中的A岛)。这条河将陆地分成了下面4个区域,该处还有着7座连接这些陆地的桥梁。
问题是如何从某地出发,依次沿着各个桥,必须经过每座桥且每座桥只能经过1次,最终回到原地。
不知道这个问题且好奇的童鞋现在肯定在忙活着找出来这道题的结果了。
是伟大的数学家欧拉(Leonhard Euler)在1736年首次使用图的方法解决了该问题。
欧拉将上面的模型转换成了下面这种”图“的形式。
欧拉把顶点的度定义为与该顶点相关联的边的条数,并且他证明了存在从任意点出发,经过所有边恰好一次,并最终回到出发顶点的走法的充分必要条件是:每个顶点的度均为偶数。人们称之为欧拉闭迹(Eulerian walk)。
简要定义
图 (graph)G=(V,E) 由顶点(vertex)的集 V 和边(Edge)的集
有时也把边称作弧(arc),如果点对 (v,w) 是有序的,那么图就叫做有向的图(有向图)。如果点对 (v,w) 是无序的,那么图就叫做无向的图(无向图)。简单的讲,边没有指向性的图叫做无向图,边具有指向性的图叫做有向图。
顶点 v 和
我们可以给边赋予各式的属性,比如权值(cost)。权值可以表示从一个顶点到另一个顶点的距离,也可以表示一个顶点到另一个顶点说话费的代价(比如时间、金钱等)。一个边上带权值的图称为网络(network)。
如果无向图中从每一个顶点到其他每个顶点都存在一条路径,则称该无向图是连通的(connected)。具有这样性质的有向图称为是强连通的的(strongly connected)。如果有向图不是强连通的,但它的基础图(underlying graph)(也就是其弧上去掉方向说形成的图)是连通的,那么称该有向图是弱连通的(weakly connected)。完全图(complete graph)是其每一对顶点间都存在一条边的图。
所谓入度(indegree)是指的顶点
如下表示了一个有着7个顶点和12条边的有向图。
如果具有n个顶点,e条边的图G的顶点i的度为 di ,则G的边数为:
e=∑n−10di2
以上这个数学公式的markdown“源码”:
$ e =\frac { \sum_{0}^{n-1} d_i} {2} $
现在将图看作抽象数据类型,下面给出ADT图的结构:
objects | 一个非空顶点的集合和一个无向边的集合,其中每条边都是一个顶点对 |
---|
functions | 对于所有的 graph∈Graph , v , v1 , v2∈Vertices |
---|---|
Graph Create() | return一个空图 |
Graph InsertVertex (graph, v) | 向图graph中插入没有关联边的新顶点v,return改变后的图 |
Graph InsertEdge (graph, v1 , v2 ) | 在图graph的顶点 v1 和 v2 之间插入一条边,return改变后的图 |
Graph DeleteVertex (graph, v) | 删除图graph的顶点v及与其关联的所有边,return改变后的图 |
Graph DeleteEdge (graph, v1 , v2 ) | 删除图graph的边( v1 , v2 ),顶点 v1 , v2 不删除,return改变后的图 |
Boolean IsEmpty (graph) | if(graph==空图) return TRUE,else return FALSE |
List Adjacent (graph, v) | return顶点v的所有邻接结点 |
图的存储表示方式
图主要有3种常用的存储表示方式:邻接矩阵(adjacency matrices),邻接表(adjacency lists),邻接多重表(adjacency multilists)。
邻接矩阵
邻接矩阵使用 |V|∗|V| 的二维数组来表示图。 g[i][j] 表示的是顶点 i 和顶点
1)因为在无向图中,我们只需要知道顶点 i 和顶点
2)而在有向图中,我们只需要知道是否有从顶点 i 到顶点