【图论】基本概念与图的存储
图论中的一些基本概念和图的存储方法
基本概念
顶点&边
-
顶点 (Vertex or Node) 构成点集 (Vertex set)。
-
边(Edge) 构成边集 (Edge set)
- 常记作, 称为 的 端点 (Endpoint)。
- 有向边 (Directed edge) 或 弧 (Arc): 有序,有时也写作 。设 ,则此时 称为 的 起点 (Tail), 称为 的 终点 (Head),并称 是 的直接前驱, 是 的直接后继。
- 无向边 (Undirected edge) 或边 (Edge): 无序。
图
图 (Graph) 是一个二元组$G=(V(G), E(G)) $ ,其中 是非空点集 (Vertex set), 是边集 (Edge set)。
常记作 ,图 的点数 也被称作图 的阶 (Order)。
自环与重边
自环 (Loop):,则 称作自环。
重边 (Multiple edge):若 中存在两个完全相同的边,则它们被称作(一组)重边。
分类与相关概念
按有限性分类
当 都是有限集合时,称 为 有限图;当 或 是无限集合时,称 为无限图。
按边的性质分类
有向图 (Directed graph): 中均为有向边。
无向图 (Undirected graph): 中均为无向边。
混合图 (Mixed graph): 中既有有向边也有无向边。
赋权图:每条边都有权值。其中边权全是正的为正权图。
稀疏图 (Sparse graph):边很多,**稠密图 (Dense graph)**刚好相反。这个一般用于讨论时间复杂度为 的算法与 的算法的效率差异(稀疏图优先选择后者)。
补图:对于无向图
反图
简单图 (Simple graph):若一个图中没有自环和重边,它被称为简单图。否则为多重图 (Multigraph)。
点的相邻和点的度
-
对于两顶点 和 ,若存在边 ,则称 和 是相邻的 (Adjacent)。
一个顶点 的**邻域 (Neighborhood)**是所有与之相邻的顶点所构成的集合,记作。
一个点集 的邻域是所有与 中至少一个点相邻的点所构成的集合,记作 ,即。
-
度 (Degree) :与一个顶点 关联的边的条数,记作 。
-
无向简单图,有 。
-
握手定理(图论基本定理):对于任何无向图 ,有 。
推论:在任意图中,度数为奇数的点必然有偶数个。
-
孤立点 (Isolated vertex):
叶节点 (Leaf vertex)/悬挂点 (Pendant vertex):
偶点 (Even vertex):
奇点 (Odd vertex):,其中一张图中奇点必有偶数个。
-
对于一张图,所有节点的度数的最小值称为最小度 (Minimum degree),记作 ,最大值称为最大度 (Maximum degree),记作 。
-
对于有向图,以一个顶点为起点的边的条数称为该顶点的出度 (Out-degree),记作 或 。以一个顶点为终点的边的条数称为该节点的入度 (In-degree),记作 或 。对于任何有向图 ,有:
-
对于无向图 ,每个顶点的度数都是一个固定的常数的,称为 k - 正则图 (-Regular Graph)。
-
路径
将若干个点连接起来的边的集合。
边的数量被称作这条途径的长度,如果边是带权的,长度通常指路径上的边权之和。
- 简单路径 (Simple path):路径连接的点两两不同。
- 回路 (Circuit):路径头尾相接。
- 简单回路/简单环 (Simple circuit):路径中仅头尾相接。
子图
对于图 , ,则称 是 的子图 (Subgraph),记作 。
连通性
存在一条 到 的路径则 连通 (Connected)。
无向图
-
图中任意两个顶点均连通的称连通图 (Connected graph)。
-
若 是 的一个连通子图,则 是 的一个连通块/连通分量 (Connected component)。若不存在 使 则 是 的一个极大连通子图。
有向图
- 有向图的节点两两互相可达,则称这张图是强连通的 (Strongly connected)。
- 一张有向图的边替换为无向边后可以得到一张连通图,则称原来这张有向图是弱连通的 (Weakly connected)。
- 同无向图,有弱连通分量 (Weakly connected component)、极大弱连通子图、强连通分量 (Strongly Connected component)、极大强连通子图。
割
- 强连通图 , 若 且 不是连通 图, 则 是图 的一个点割集 (Vertex cut/Separating set)。大小为一的点割集又被称作割点 (Cut vertex)
- 强连通图 和整数 , 若 且 不存在大小为 的点割集, 则称 图 是**-点连通的 -vertex-connected)** ,使上式成立的最大的 被称作图 的点连通度 (Vertex connectivity),记作 。
- 非完全图点连通度为最小点割集的大小, 完全图 的点连通度为 。
- 对于图 以及 满足 和 不相邻, 可达 , 若 , 且在 中 和 不连通, 则 被称作 到 的点割集。 到 的最小点割集的大小被称作 到 的 局部点连通度 (Local connectivity), 记作 。
- 对于连通图 , 若 且 (即从 中删去 中的边) 不是连通图, 则 是图 的一个边割集(Edge cut)。大小为一的边割集又被称作桥 (Bridge)。
- 对于连通图 和整数 , 若 不存在大小为 的边割集, 则称图 是 - 边连通的 -edge-connected),使上式成立的最大的 被称作图 的边连通度 (Edge connectivity),记作 。边连通度为最小边割集的大小。
- 对于图 以及 满足 可达 , 若 , 且在 中 和 不连通, 则 被称作 到 的边割集。 到 的最小边割集的大 小被称作 到 的 局部边连通度 (Local edge-connectivity), 记作 。
- 点双连通 (Biconnected):没有割点的强连通图是点双连通的。
- 即对于任意两个点,无论删去图中哪个点(只能删去一个,且不能删自己),它们始终连通。
- 点双连通没有传递性
- 边双连通 (2-edge-connected) :没有桥的强连通图是边双连通的。
- 即对于任意两个点,无论删去哪条边(只能删去一条),它们始终连通。
- 边双连通有传递性
存图
邻接矩阵
邻接矩阵(二维数组):空间 , 表示 的边是否存在/权值大小
一般不用于稀疏图
遍历时先检查是否有边
邻接表
无边权
1 | vector<int> G; |
有边权
排序之后可以log复杂度查边
结构体写法:
1 | struct edge { |
pair写法:
1 | typedef pair<int, int> pii; |
邻接链表
以链表储存每一个点的所有边
链式前向星:
1 | struct Edge{ |
无向边存邻接表的技巧:每条边的序号 为偶数,反边存在,利用位运算^ 迅速找到反边