一、图的定义
图(Graph)是由顶点的有穷非空集合和顶点之间的集合组成,通常表示为:
G(V,E),其中G表示一个图,
V是图G中顶点的有限集,
E是图G中边的有限集,
边是V中顶点的有序或无序偶对。
注意
1、图中的数据元素称为顶点(Vertex)
2、在图结构中不允许没有顶点
3、图中,任意两个顶点之间都有可能有关系,顶点之间的逻辑关系用边来表示(边集可以为空)
边的划分
- 无向边
若顶点Vi到Vj之间没有方向,则称这条边为无向边(Edge),用无向序偶对(ViVj)表示。若图中任意两个顶点之间都是无向边,则称该图为无向图(Undirected graphs)。 - 有向边
若从顶点Vi到Vj的边有方向,则称这条边为有向边。也称为弧(Arc)。连接顶点Vi到Vj的有向边就是弧,Vi是弧尾,Vj是弧头,用<Vi,Vj>表示(不能写成<Vj,Vi>.
图的划分
- 简单图:图中不存在顶点到自身的边且同一条边不重复出现
- 无向图:图中任意两个顶点之间都是无向边
- 有向图:图中任意两个顶点之间的边都是有向边
- 完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图;在有向图中,如果任意两点之间都存在方向互为相反的两条弧,则称该图为有向完全图。
- 稀疏图:边(弧)少
- 稠密图:边(弧)多
- 连通图:在图G=(V,{E})中,任意两个顶点vi、vj ∈ \in ∈E,vi和vj都是连通的。
子图: 假设有两个图G1和G2,图G2中的边和顶点包含于图G1,那么称G2是G1的子图
有些图的边或弧有与它相关的数字,这个数叫做权(Weight),可以表示从一个点到另一个点的距离或耗费,这种带权的图通常称为网(Network)。
图的边数
设图中顶点数为n,边数为e,则
有向图边数:0
≤
\leq
≤e
≤
\leq
≤n(n-1)
无向图边数:0
≤
\leq
≤e
≤
\leq
≤n(n-1)/2
有向完全图:e = n(n-1)
无向完全图:e = n(n-1)/2
注意: 在图的定义中不包含重复边和端点是同一个顶点的边
顶点的度
顶点V的度:关联于顶点V的边或弧的数目
有向图顶点V的入度:以顶点V为弧头的边数
有向图顶点V的出度:以顶点V为弧尾的边数
路径
路径:从一个顶点V出发,沿着边/弧到达另一个顶 点V’所经历的顶点序列
回路(环):起点和终点是同一个顶点的路径
简单路径/简单环:除了起点和终点外,路径上其余顶点不重复出现的路径/环
路径的长度:路径上边(弧)的数目
无向图的连通性
连通:如果无向图中顶点vi与Vj之间有路径,称vi与Vj是连通的
连通图:无向图中任意两个顶点之间都连通
连通分量:无向图的极大连通子图称为G的一个连通分量。
有向图的连通性
弱连通图:如果有向图去掉每条边的方向后得到的无向图是连通的,称该图是弱连通图。
单向连通图:如果有向图中任意两个顶点之间至少一个可达另一个,则称该有向图是单向连通图。
强连通:如果Vi到Vj有路径,Vj到Vi也有路径,称Vi到Vj是强连通的;
强连通图:有向图中任意两个顶点之间都强连通;
强连通分量:有向图的极大强连通子图称为该有向图的一个强连通分量
带权图(网)
图中每条边带有相应的权值的图也叫做网。
树
树:树是无回路的连通图
无向连通图的生成树:设G(V,E)是具有n个顶点的无向连通图,G的生成树是G的一个极小连通子图,它包含了G的n个顶点及构成树的n-1条边。
对非连通图G而言,其每个连通分量都具有相应的生成树,构成了G的生成森林。
术语总结
二、图的存储结构
1、邻接矩阵表示法
定义
图的邻接矩阵(Adjacency Matrix)表示法使用两个数组来表示图,一个以唯数组存储图中的顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息
2、邻接表表示法
定义
图的邻接表(Adjacency List)表示法,图中使用一个一维数组存储(也可使用单链表)顶点,并且每个数据元素还需存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,使用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。
三、图的遍历
1、深度优先遍历DFS(Depth_First_Search)
DFS遍历过程:
- 从图G中选某个顶点V作为出发点;
- 访问V;
- 依次从V的未被访问的邻接点出发,深度优先搜索遍历图G, 直至与V相通的顶点都被访问完;
- 如果此时图G中还有顶点未曾被访问,则从这些未被访问的顶点中再选一个顶点V,转2,继续遍历;否则遍历结束。
2、广度优先遍历BFS(Breadth_First_Search)
BFS遍历过程:
- 从图G的某个顶点v出发,访问v;
- 依次访问V的未被访问的邻接点;
- 再按照“先被访问顶点的邻接点先访问”的次序,依次访问这些邻接点的邻接点,直至图中所有已被访问的顶点的邻接点都被访问到;
- 若此时图中还有顶点未曾被访问,则另选一个未被访问的顶点v作为出发点,重复上述过程,直至图中所有的顶点都被访问完。