从这一篇博客开始,我们逐渐会开始学习一些图的相关的算法了。
首先我们明白一下什么时图。
我们通常提到的图都是有两个组成部分:顶点,边。
顶点是图的基本元素,而边则是代表顶点之间有没有连接关系。根据边的方向性,图又分为有向图和无向图两种。
举个简单的例子,成都和北京,两个城市就可以看作是两个顶点。彼此间有飞机可以来往,既可以从成都到北京,又可以从北京到成都,因此这个关系可以表示为无向图。但是如果假设某一天打仗了。因为敌人的干扰,我们只能从成都到北京,而北京的飞机出不来。那么此时,就是一个有向图了。
而通常图的表示有两种方法。邻接矩阵和邻接表。
邻接矩阵是用一个矩阵来保存图,是一个n x n的矩阵A,n为顶点数。如下图所示:
矩阵元素代表顶点i 到顶点 j有连接, 这里这个1 也可以换成是i 到 j 的路径权重。可以看到邻接矩阵存储代价为。
邻接表的表示如下:
如上图所示,第一条信息表示 节点0 与节点1存在通路, 通常我们还要在1 后面存储下0 到1通路的权重。第二条信息表示,节点1 与节点 0 2 3 存在通路,后面的信息类似。
邻接表的存储代价为2n+2m, 其中m代表边的数量。化简为。
下面给出一些图的简单的推论。
lemma 1: 顶点为n的图,最少存在n-1条边,最多为。
Proof: n个顶点的的图,边最少的情况为 连成一条直线的情况,即每增加一个点,只增加了一条边。递推式为
边数最多的情况,是每增加一个点,都与当前已有的点连一条边。递推式为, 此时总的边数为
lemma 2: 边数接近的图称为稀疏图,边数接近的图成为密集图。
注:文中邻接矩阵和邻接表的图引用自这个博客: