图(Graph):图G由两个集合构成,记作G=<V,E>
其中V是顶点的非空有限集合,E是边的有限集合,其中边是顶点的无序对或有序对集合。
无向图(Digraph):在图G中,若所有边是无向边,则称G为无向图;
有向图(Undigraph):在图G中,若所有边是有向边,则称G为有向图;<v,w>,v为弧尾,w为弧头。
混和图:在图G中,即有无向边也有有向边,则称G为混合图;
网络:与边相关的数据成为权,边上带权的图称为网络。
邻接点:边的两个顶点。
关联边:若边e=(v,u),则称顶点v、u关联边e。
顶点v的入度=以v为终点的有向边的数量。
顶点v的出度=以v为起点的有向边的数量。
顶点v的度=v的入度+v的出度
图的所有顶点的度数和=2*边的数量
简单路径:在一条路径中,若除起点和终点外,所有顶点各不相同。
由简单路径组成的回路称为简单回路。
连通图(强连通):在有向(无向)图G中,若对任何两个顶点u、v都存在从u到v的路径。
子图:设有两个图G=(V,E)、G1=(V1,E1),若V1包含于 V,E1 包含于 E,E1关联的顶点都在V1中,则称 G1是G的子图;
连通分量(强连通分量):
无向图G 的极大连通子图称为G的连通分量。 极大连通子图意思是:该子图是 G 连通子图,将G 的任何不在该子图中的顶点加入,子图不再连通。
生成树:包含无向图G 所有顶点的的极小连通子图称为G 的生成树。
极小连通图:该子图是G 的连通子图,在该子图中删除任何一条边,子图不再连通。
生成树含有全部n个顶点,但只有n-1条边。而且没有回路,再加一条边必然形成回路。
在生成树中任意两个顶点间的路径是唯一的。
无向完全图:有n(n-1)/2条边(图中每个顶点和其余n-1个顶点都有边相连)的无向图。
有向完全图:有n(n-1)条边(图中每个顶点和其余n-1个顶点都有弧相连)的有向图。
稀疏图:对于有很少条边的图(e < n log n)称为稀疏图,反之称为稠密图。
图的存储方法:
邻接矩阵(无向):
无向图的邻接矩阵是对称的。
顶点i的度=第i行(列)中1的个数。
完全图的邻接矩阵中,对角元素为0,其余全部是1。
邻接矩阵(有向):
有向图的邻接矩阵可能是不对称的。
顶点vi的出度=第i行元素之和。
顶点vi的入度=第i列元素之和。
顶点的度=第i行元素之和+第i列元素之和。
优点:很容易实现图的操作。
缺点:空间效率低,特别是稀疏图。
邻接表:
顶点通常按编号顺序将顶点数据存储在一维数组中。
关联同一顶点的边:用线性链表存储。
优点:空间效率高,容易寻找顶点的邻接点。
缺点:判断两个顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。
邻接矩阵多用于稠密图的存储,而邻接表多用于稀疏图的存储。
对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。
图的遍历:从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次。
为了保证图中的各顶点在遍历过程中访问且仅访问一次,需要为每个顶点设一个访问标志,用以标示图中每个顶点是否被访问过,访问标志用数组visited[n]来表示。
图常用的遍历方法有两种:深度优先搜索、广度优先搜索
深度优先搜索(DFS)的基本方法(类似二叉树的先序遍历):从图的某一顶点V0出发,访问此顶点;然后依次从V0的未被访问的邻接点出发,深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。
广度优先搜索(BFS)的基本方法(类似树的层次遍历):从图的某一顶点V0出发,访问此顶点后,依次访问V0的所有未曾访问过的邻接点;然后分别从这些邻接点出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。
最小生成树:如果无向连通图是一个带权图,那么它的所有生成树中必有一棵边的权值总和为最小的生成树。
构造最小生成树:
普里姆Prim算法的基本思想:
设N=(V,{E})是连通网, T=(U,{TE})是N上最小生成树
初始令U={u0},(u0属于V), TE=空集
在所有u属于U,v属于V-U的边(u,v)属于E中,
找一条代价最小的边(u0,v0)
将(u0,v0)并入集合TE,同时v0并入U
重复上述操作直至U=V为止,则T=(V,{TE})为N的最小生成树,共重复n-1次。