图
图的定义
图也是一种非线性结构,图中任意2个顶点之间都有可能有直接的关系。
flowchart TB
1((1))
2((2))
3((3))
4((4))
5((5))
1 --- 2
1 --- 5
2 --- 3
3 --- 4
4 --- 5
4 --- 1
- 有向边和无向边:带箭头的单通道为有相边,不带箭头双通道为无向边。
- 无向图:图中任意顶点之间均为无向边
- 有向图:图中任意顶点之间均为有向边
- 完全图:
- 无向完全图中两两顶点之间均有连线,n个顶点的完全无向图有
n*(n-1)/2
条边 - 有向完全图中两两顶点之间均有连线,n个顶点的完全有向图有
n*(n-1)
条边
- 无向完全图中两两顶点之间均有连线,n个顶点的完全无向图有
- 度,出度和入度:进出某个顶点的边的数目。进入该顶点的边数称为
入度
,从该顶点出去的边数称为出度
, 在无向图中不分入度和出度,在有向图中顶点的度为出度和入度之和 - 路径:存在一条通路,可以从一个顶点到达另外一个顶点,有向图的路径是有方向的
- 连通图和连通分量:在无向图中,任意两个顶点之间都是有路径连通的称为连通图,无向图的极大连通子图称为其连通分量
- 强连通图和强连通分量:在有向图中,任意两个顶点之间都相互存在路径称为强连通图,有向图的极大连通子图称为其强连通分量
- 生成树:一个连通图的生成树就是该图的连通性不变,单没有环路的子图。一个有n个顶点的生成树有且仅有n-1条边
- 网:边带有权值的图称为网
图的存储
图的存储主要有两种,邻接矩阵和邻接表
- 邻接矩阵:n个顶点的图可以用n*n的邻接矩阵来表示,如果顶点i到顶点j存在边,则矩阵元素A[i][j]的位置为1,否则为0,有向图中矩阵中节点对因横向之和是该图的出度,纵向之和是该图的入度
- 邻接表:是一种链式存储结构,用一个一维数组存储所有的顶点,对数组中的每个顶点生成一个链表,链表中每个顶点(表节点),包括顶点号,顶点信息(如边的权值)以及指向下一个顶点(出度)的指针
图的遍历
从图的任意顶点出发,对图中所有顶点仅访问一次,分为深度优先搜索
和广度优先搜索
- 深度优先搜索:类似于树的先根遍历
- 访问一个顶点 V
- 一次性搜索顶点 V 的所有邻接顶点
- 若邻接顶点未被访问,则深度优先搜索邻接顶点,若已被访问,则跳到顶点 V 的下一个邻接顶点
- 广度优先搜索:类似于树的层次遍历,深度越小越优先被访问
- 访问一个顶点 V
- 依次访问顶点 V 所有未被访问的邻接顶点
- 分别访问这些邻接点未被访问的所有邻接点
两种优先搜索的时间复杂度:使用邻接矩阵存储均为O(n^2)
, 使用邻接表存储均为O(n+e)
,n为顶点个数,e为边的个数
最小生成树
- 生成树:一个连通图的生成树就是该图的连通性不变,单没有环路的子图。一个有n个顶点的生成树有且仅有n-1条边
- 最小生成树:
- 包含连通图所有顶点的树
- 有且仅有 n-1 条边
- 这些边权值最小
- 求连通带权无向图的最小生成树
- 普里姆算法(Prim)
- 克鲁斯卡尔算法(Kruskal)