图:(多对多关系,非线性结构)
- 定义:
- 图G(Graph)由两个集合V(Vertex)和E(Edge)组成,记为G=(V,E)。(图由顶点集和边集组成)
- V是顶点的有限集合,记为V(G)
- E是连接V中两个不同顶点的边的有限集合,记为E(G)
- 图中不能一个顶点也没有,图的顶点集V一定非空,但边集E可以为空,此时图中只有顶点而没有边
有向图:如果表示边的顶点对(或序偶)是有序的,则称G为有向图(边带方向)
无向图:如果代表边的顶点对(或序偶)是无序的,则称G为无向图(边不带方向)
完全图:
完全无向图:每两个顶点之间都存在着一条边。含有n个顶点的完全无向图有n(n-1)/2条边
完全有向图:每两个顶点之间都存在着方向相反的两条边。含有n个顶点的完全有向图包含有n(n-1)条边。
带权图(网):边上带有值的图
子图:在原图基础上去掉某些边或顶点
度:该顶点端点边的数目(无向图的全部顶点的度的和等于边数的2倍,有向图的全部顶点的入度之和与出度之和相等,并且等于边数)
出度:有向图中该顶点出发指出的边数
入度:有向图中指向该顶点的边数
路径:从某个顶点到另一个顶点经过的顶点序列,如(0,3,2,1)
路径长度:路径经过边的条数
简单路径:除开始点和结束点可以相同外,其余顶点均不相同(中间无经过同一顶点多次)
环(回路):一条路径上开始和结束顶点相同
连通:顶点到顶点有路径可到达
连通图:任意两个顶点都连通(任意两个顶点都有路径可达)
连通分量:无向图G中的极大连通子图(任何连通图的连通分量只有一个即本身,而非连通图有多个连通分量)
强连通:任意两个顶点都互相可达
- 强连通分量:有向图G中的极大强连通子图(强连通图只有一个强连通分量即本身,非强连通图有多个强连通分量。一般地单个顶点自身就是一个强连通分量)
生成树:包含图中全部顶点的一个极小连通子图(n个顶点,n-1条边)
- 最小生成树:多颗生成树中权值和最小的(如果上图只有这两个生成树,则生成树1的权值和为1 + 2 + 3 =6,生成树2的权值和为1 + 4 + 5 =10,则生成树1为最小生成树)
图的存储结构(实现方式):
邻接矩阵:顶点之间邻接关系的矩阵(用二维数组存储)
无向图邻接矩阵(关于主对角线对称)
有向图邻接矩阵
带权有向图邻接矩阵
邻接表
无向图邻接表:
带权有向图邻接表:
weight:权值
图的遍历:
深度优先遍历(DFS):它从图的某个顶点开始遍历,沿着一条路径走到底,直到不能再走为止,然后回溯到前一个节点,继续沿着另一条路径走到底,直到所有的节点都被访问过为止
广度优先遍历(BFS)(逐层遍历):它从图的某个顶点开始遍历,先访问该顶点的所有邻居节点,然后依次访问它们的邻居节点,直到所有的节点都被访问过为止
- 邻接矩阵实现图
1 | //实现1 |
1 | //实现2 |
- 邻接表实现图
1 | public class Graph { |
- 本文作者: zzr
- 本文链接: http://zzruei.github.io/2023/02ead90048.html
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!