相关定义
图是一个二元组 \((V,E)\),节点集合为 \(V\),边集合为 \(E\),其中边 \((u,v)\) 的顶点为 \(u,v\)。
其中顶点的度数为以该顶点为端点的边数。
有向图: 每条边存在一个方向 \(u\) -> \(v\),对于有向图,点 \(u\) 的出度为从 \(u\) 出发的边数,入度为到 \(u\) 的边数。
无向图: 每条边不存在方向,\((u,v)\) 和 \((v,u)\) 代指同一条边。
混合图: 既有有向边又有无向边。
简单图: 图中没有自环和重边。
完全图: 一个图的每一对不同顶点恰有一条边相连。
带权图: 图中的点 \(x\) 可以有点权 \(w_x\),图中的边 \((u,v)\) 可能有边权 \(w_{u,v}\)。
树: 有 \(n\) 个点和 \(n-1\) 条边的无向简单连通图,两点之间的路径是唯一的,分为有根树和无根树。
森林: 若干个树组成的图。
基环树: 有 \(n\) 个点和 \(n\) 条边的无向简单连通图。该图中有且仅有一个环,将环上的边都删掉后可以得到一个森林。
二分图: 可以将点集 \(V\) 分为两个集合 \(V_1,V_2\),满足每条边 \((u,v)\) 中两个点一个在集合 \(V_1\) 另一个在集合 \(V_2\)。
平面图: 可以将图中的点镶嵌到平面上的点,并且任意两条边除了在端点外不会相交。
竞赛图: 对于任意一对点 \((u,v)\) 之间都恰好有一条有向边的有向图,图中恰好有 \(\frac{|V|(|V|-1)}{2}\) 条边。
图的储存
邻接矩阵: 使用二维数组储存图,适用于稠密图。
邻接表: 使用动态数组 std::vector
储存s
以有向带权图为例: