图
图可以分为有向图(directed graph)和无向图(undirected graph)。
每个顶点都临界的无向图为完全图(complete graph)。如果无向图G的顶点集V可以划分为V1,V2,是的对(u,v)属于E有u属于V1,v属于V2,则称图为二分图(bipartite graph)。
无回路的无向图成为森林;连通的,无回路的无向图为(自由)树,也叫做有向无环图(dag)。
有n(n-1)/2条边的无向图称为完全图(complete graph).
具有n(n-1)条弧的有向图称为有向完全图.
对于有向图,e的取值范围时0 到 n(n-1).
有很少条边的图称为稀疏图(sparse graph),有反之称为稠密图(dense graph).
有向图
有向图G是一对(V,E),其中V是有穷集,E是V上的二元关系。V成为G的顶点集,E成为G的边集。可能存在自身环(self-loops)。
G中一条边(u,v),称(u,v)离开(incident from/leaves)定点u,到达(incident to/ enters)定点v。
顶点的度等于该顶点的入度(in degree)和出度(out degree)之和。出度是以其为起点的边的个数;入度是以其为终点的边的个数。
无向图
无向图G中,边集E是由无序定点对,而非有序顶点对构成的。(u,v)和(v,u)视为同一条边。在无向图中不允许有自身环。
G中一条边(u,v),称(u,v)关联(incident on)定点u,v,顶点u,v是相邻的(adjacent).
在无向图中,顶点的度(degree)是与之关联的边的个数。如果一个顶点的度为0,则成为孤立的(isolated)。
无论是有向图还是无向图, 都满足图的边数 e = 度之和/2
路径
图G中顶点u到顶点v的路径是,以顶点u为起点,顶点v为终点的顶点的集合。路径中边的个数为路径的长度。
如果图中包含顶点u到顶点v的路径p,则成顶点u是经过p可达(reachable)顶点v的。
如果一个路径中所有顶点都是不同的,则成为简单路径(simple path)。
在有向图中,如果起点与终点相同,且路径至少有一条边,则成路径(v0,...,vk)形成回路。如果回路中顶点个不相同,则为简单回路。
连通
在无向图中,如果所有顶点都有路径相连,则成为连通图(connected)。连通分量(connected component)指的是无向图的极大连通子图。
在有向图中,如果每对顶点都是相互可达的,则称其为强连通图(strongly connected)。有向图的极大强连通子图称做有向图的强连通分量。
生成树
一个连通图的生成树是一个极小的连通子图,它包含图中所有的顶点,但是只有n-1条边.
对于有n个顶点的图,如果其边数少于n-1,则非连通;如果其边数多于n-1,则存在环;边数为n-1的不一定是生成树.
存储模式
邻接矩阵: 所需空间O(V*V), 可以在O(1)的时间判断两个顶点(vertex)是否相邻.(对于稀疏图,耗费空间)
邻接表: 所需空间O(V + E), 判断两个顶点是否相邻需要遍历相关两个链表.(缺点: 边的两个顶点在不同的链表中).
十字链表: 所需空间O(V + E), 可以方便的计算顶点的出度和入度,寻找以某顶点为头/尾的边.(有向图)
邻接多重表:
遍历
图中任何顶点都有可能和其余的顶点相邻接,在访问了某个顶点后,可能沿着某条路径又回到该顶点上.所以,需要辅助数组.
时间复杂度: 在遍历图时,依靠辅助数组,对每个节点只会访问一次.因此,对于邻接矩阵存储的图,遍历的时间复杂度为O(V*V);对于邻接表存储的图,遍历的时间复杂度为O(V+E).