图的基础知识

图是什么

图由顶点(vertex 或 node)和边 ( edge ) 组成,顶点的集合是V,边的集合是E的图记为G = (V,E)。连接两点u和v的边用e = (u,v)表示。
在这里插入图片描述

1.图的种类

大体分为无向图和有向图。
在这里插入图片描述
我们可以给边赋予各种各样的属性。比较具有代表性的有权值( cost )。边上带有权值的图叫做带权图。在不同问题中,权值可以代表距离、时间以及价格等不同的属性。

在这里插入图片描述

2.无向图的术语

两个顶点之间如果有边连接,那么就视为两个顶点相邻。相邻顶点的序列称为路径。起点和终点重合的路径叫做。任意两点之间都有路径连接的图叫做连通图。顶点连接的边数叫做这个顶点的度

在这里插入图片描述
没有圈的连通图叫做树( tree ),没有圈的非连通图叫做森林。- -棵树的边数恰好是顶点数-1。反之,边数等于顶点数- 1的连通图就是一棵树
如果在树上选择-一个顶点作为根( root),就可以把根提到最上面,而离根越远的顶点越往下安排其位置。这样的树叫做有根树
不过,对于无根树,有时选择适当的顶点作为根使之变成有根数,可以使问题得到简化。
在这里插入图片描述

3.有向图的术语

以有向图的顶点v为起点的边的集合记作δ +(1),以顶点v为终点的边的集合记作δ (1)。| δ +(v)叫做v的出度,| 8 (v)叫做边的入度。

在这里插入图片描述
没有圈的有向图叫做DAG ( Directed Acyclic Graph)。例如,让我们用顶点表示整数,n能整除m时从n向m连一条边的图, 这就构成-个DAG。 像下图-样,在DAG中我们可以给顶点标记一个先后顺序。
在这里插入图片描述
对于每个顶点我们给它一个编号, 第1号顶点叫做v。那么存在从顶点v到顶点y的边时就有i<j成立,这样的编号方式叫做拓扑序
在这里插入图片描述
如果把图中的顶点按照拓扑序从左到右排列,那么所有的边都是从左指向右的。
因此,通过这样的编号方式,有些DAG问题就可以使用DP来解决了。求解拓扑序的算法叫做拓扑排序

图的表示

为了能在程序中对图进行处理,需要把顶点和边用具体的数据结构存储下来。在图的表示方法中,比较具有代表性的有邻接矩阵邻接表。需要注意的是,两种表示方法都有各自的优缺点,根据问题的不同,使用不同的存储方式可能会影响算法的时间复杂度。

1.邻接矩阵

邻接矩阵使用 |V| x |V| 的二维数组来表示图。g[i][j]表示的是顶点i和顶点j的关系。

  • 无向图中,只需知道“顶点i和顶点j之间是否有边连着”这样的信息,因此如果顶点i和顶点 j之间有边相连,那么g[i[j]和g[j][i]就设为1,否则设为0。这样就可以表示一个无向图了。
    在这里插入图片描述
  • 有向图中,只需要知道“是否有从顶点i发出指向顶点j的边”这样的信息,因此如果顶点i有一条指向顶点的边,那么g [i] [j]就设为1,否则设为0。这样就可以表示一个有向图了。有向图与无向图不同,并不需要满足 g[i] [j] = g[j] [i]。

在这里插入图片描述

  • 带权图中,g[i][j]表示的是顶点到顶点j的边的权值。由于在边不存在的情况下,如果将g[i][j]设为0,就无法和权值为0的情况区分开来,因此选取适当的较大的常数INF (只要能和普通的权值区别开来就可以了),然后令g[i][j] = INF就好了。
    当然,在无向图中还是要保持 g[i] [j] = g[j] [i]。
    在这里插入图片描述
  • 此外,两点之间有重边或者某个顶点有自环(参照下图)的情况需要特别注意。在无权图中,只需要设g[i][j]为顶点i到顶点j的边数即可;
    但是在带权图中却无法这样。大部分情况下,只需要保存权值最小(最大)的边就可以了,所以在这种情况下可以无视其他的边。必须保存所有的边时,可以使用邻接表
    在这里插入图片描述

2.邻接表

用邻接矩阵表示稀疏图会浪费大量内存空间。
而在邻接表中,是通过把“从顶点0出发有到顶点2, 4, 5的边”这样的信息保存在链表中来表示图的。这样只需要O(|V|+IE|)的内存空间。

在这里插入图片描述

3.小结

稀疏图使用邻接表处理较好。能大大降低(相比于使用邻接矩阵处理)空间复杂度。

发布了77 篇原创文章 · 获赞 100 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/S_123789/article/details/104672613