Commit e907ca0f authored by ouuan's avatar ouuan
Browse files

feat(graph): merge index, basic, misc into concept and save, add new index

parent 71172ca2
Loading
Loading
Loading
Loading

docs/graph/basic.md

deleted100644 → 0
+0 −179
Original line number Diff line number Diff line
## 图是怎么存的?

### 直接存边

什么意思呢?我们开一个数组,数组里每个元素是图的一条边。

这样做有个缺点,每次想要知道两个点之间是否有连边(或者说一条边是否存在),都需要在数组里进行一番查找。而且如果没有对边事先排序的话,就不能使用二分查找的方法( $O(\log n)$ ),而是每次只能按顺序找( $O(n)$ ),成本较高。

什么时候会用到这个方法呢?最简单的一个例子是使用 Kruskal 算法求 [最小生成树](/graph/mst) 的时候。

### 邻接矩阵

邻接矩阵的英文名是 adjacency matrix。它的形式是 `bool adj[n][n]` ,这里面 $n$ 是节点个数, $adj[i][j]$ 表示 $i$ 和 $j$ 之间是否有边。

如果边有权值,也可以直接用 `int adj[n][n]` ,直接把边权存进去。

它的优点是可以在 $O(1)$ 时间内得到一条边是否存在,缺点是需要占用 $O(n^2)$ 的空间。对于一个稀疏的图(边相对于点数的平方比较少)来说,用邻接矩阵来存的话,成本偏高。

### 邻接表

邻接表英文名是 adjacency list。它的形式是 `vector adj[n]` ,用 `adj[i]` 存以 $i$ 为起点的边。

`vector` 无法科学地删除,所以常用 `list` 实现。

它的特点是可以用来按顺序访问一个结点的出边(或者入边)。

### 前向星

为什么它搜不到英文名呢?因为是中国玩家乱搞出来的。

首先介绍一下链式前向星,本质上是用单向链表实现的邻接表。

形式上是一个结构体: `struct edge {edge *pre, int to;} *head[N], edge[M]` 

这个结构广泛出现于算法竞赛选手的代码中,编写简洁而且对于大多数题目效率足够高。

其中 `head[i]` 用来存以 $i$ 为起点的边, `edge` 数组是边表。

那么什么是前向星呢?事先把 `edge` 数组排个序即可。这里可以使用 [基数排序](/basic/radix-sort) 做到 $O(m)$ 。

## 图的基本概念

### 路径

path,是指一个边的序列,其中的边首尾相连。

### 简单路径

simple path,是每条边只经过了一次的路径。

### 回路

cycle,也称为 `环` ,是起点和终点相同的路径。

### 简单回路

图的定点序列中,除了起点和终点相同外,其余顶点不重复的回路。

### 可达

有向图中点 $u$ 到 $v$ 可达是指存在一条 $u$ 到 $v$ 的路径。

### 连通

#### 两个点连通

图中点 $u$ 和 $v$ 连通是指两点互相可达。

#### 图连通

如果无向图 $G$ 中任意两个节点连通,称其为是连通的。

###  [强连通](/graph/scc) 

有向图 $G$ 强连通是指, $G$ 中任意两个节点连通。

###  [弱连通](/graph/bcc) 

有向图 $G$ 弱连通是指, $G$ 中的所有边替换为无向边后, $G$ 为连通图。

### 点连通度

一张图的点连通度的大小等于最小点割集的大小。

### 边连通度

一张图的边连通度的大小等于最小边割集的大小。

### 点割集

设图 $G = <V, E>$ ,若存在 $V' \subset V$ 且 $V' \neq \emptyset$ ,使得 $p(G-V') > p(G)$ ,而对于任意的 $V'' \subset V'$ ,均有 $p(G-V'')=p(G)$ ,则称 $V'$ 是 $G$ 的点割集。特别地,若 $V'$ 是 $G$ 的点割集,且 $V'$ 是单元集,即 $V'=\{v\}$ ,则称 $v$ 为 [割点](./bridge.md)

( $p(G)$ 表示图 G 的连通分支(连通块)的个数)

### 边割集

设图 $G = <V, E>$ ,若存在 $E' \subset E$ 且 $E' \neq \emptyset$ ,使得 $ps(G-E') > p(G)$ ,而对于任意的 $E'' \subset E'$ ,均有 $p(G-E'')=p(G)$ ,则称 $E'$ 是 $G$ 的边割集(或简称为割集)。特别地,若 $E'$ 是 $G$ 的边割集,且 $E'$ 是单元集,即 $E'=\{e\}$ ,则称 $e$ 为 [](./bridge.md)

( $p(G)$ 表示图 G 的连通分支(连通块)的个数)

### 子图

选取一个节点的子集和边的子集构成的图。

#### 生成子图

选取的子图的节点和原图一样。

#### 导出子图

选取一个节点的子集,再选取这些节点相关联的边的集合构成的图。

#### 边导出子图

选取一个边的子集,再选取这些边相关联的节点的集合,构成的图。

#### 连通子图

(一个无向图的)连通的子图。

#### 连通分量

(一个无向图的)极大的连通子图。

【注】:极大是指添加任何节点或者边后都不再满足。

### 稀疏图

 $m = \Theta(n)$ 的图,或者指 $m$ 相对较小的图。

### 稠密图

 $m = \Theta(n^2)$ 的图,或者指 $m$ 相对较大的图。

### 完全图

设 $D$ 为 $n (n \geq 1)$ 阶无向简单图,弱 $G$ 中每个顶点均与其余的 $n-1$ 个顶点相邻,则称 $D$ 为 $n$ 阶无向完全图。

无向完全图的点数和边数满足这样的关系: $m = \frac{n(n-1)}{2}$ 。

设 $D$ 为 $n (n \geq 1)$ 阶有向简单图,若对于任意的 $v_i, v_j \in V(D)(v_i \neq v_j)$ ,有向边 $<v_i, v_j>$ 和 $<v_j, v_i>$ 均属于 $E(D)$ ,则称 $D$ 为 $n$ 阶有向完全图。

### 竞赛图

设 $D$ 为 $n (n \geq 1)$ 阶有向简单图,若对于任意的 $v_i, v_j \in V(D)(v_i \neq v_j)$ ,有向边 $<v_i, v_j>$ 和 $<v_j, v_i>$ 中有且仅有一个属于 $E(D)$ ,则称 $D$ 为 $n$ 阶竞赛图。

### 正则图

各顶点的度均相同的无向简单图。

### 路径的长度

一般来说,路径的长度在数值上等于路径的边数,或者如果边是带权的,则是路径的边权和。

###  [最短路径](/graph/shortest-path) 

两个节点之间,长度最小的路径。

【注】:不一定存在,不一定唯一。

### 图论基本定理

又称握手定理。设 $G=<V, E>$ 为一个无向图, $V= \{v_1, v_2, \cdots, v_n\}, |E| = m$ ,则 $\sum_{i=1}^n{d(v_i)}=2m$ 。其中 $d(v)$ 表示 v 的度数。

### 可图化

如果给定一个序列 a,可以找到一个图 G,以其为度数列,则称 a 是可图化的。

如果给定一个序列 a,可以找到一个简单图 G,以其为度数列,则称 a 是可简单图化的。

#### 判别法

 $a=(a_1, a_2, \cdots, a_n)$ 可图化当且仅当 $\sum_{i=1}^n{d_i} = 0 \pmod 2$ 

 $a=(a_1, a_2, \cdots, a_n)$ 可简单图化当且仅当 $a'=(a_2 - 1, a_3 - 1, \cdots, a_{a_1+1} - 1, a_{a_1+2} - 1, \cdots, a_n)$ 是可简单图化的。

### Whitney 定理

对任意的图 $G$ ,有 $\kappa \leq \lambda \leq \delta$ 。其中 $\kappa, \lambda, \delta$ 分别为 $G$ 的点连通度,边连通度和最小度。
+6 −6
Original line number Diff line number Diff line
## 简介

在阅读下列内容之前,请务必了解 [图论基础](./basic.md) 部分。
在阅读下列内容之前,请务必了解 [图论相关概念](./concept.md) 部分。

相关阅读: [割点和桥](./bridge.md) 
相关阅读: [割点和桥](./cut.md) 

## 定义

割点和桥更严谨的定义参见 [图论基础](./basic.md)
割点和桥更严谨的定义参见 [图论相关概念](./concept.md)

在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 $u$ 和 $v$  **边双连通**

@@ -16,7 +16,7 @@

点双连通 **不** 具有传递性,反例如下图, $A,B$ 点双连通, $B,C$ 点双连通,而 $A,C$  **不** 点双连通。

![bcc-counterexample.png](images/bcc-0.svg)
![bcc-counterexample.png](./images/bcc-0.svg)

## DFS

@@ -38,7 +38,7 @@ void DFS(int p) {

首先,对原图进行 DFS。

![bcc-1.png](images/bcc-1.svg)
![bcc-1.png](./images/bcc-1.svg)

如上图所示,黑色与绿色边为树边,红色边为非树边。每一条非树边连接的两个点都对应了树上的一条简单路径,我们说这条非树边 **覆盖** 了这条树上路径上所有的边。绿色的树边 **至少** 被一条非树边覆盖,黑色的树边不被 **任何** 非树边覆盖。

@@ -52,7 +52,7 @@ void DFS(int p) {

## DFS 找割点并判断点双连通

![bcc-2.png](images/bcc-2.svg)
![bcc-2.png](./images/bcc-2.svg)

如上图所示,黑色边为树边,红色边为非树边。每一条非树边连接的两个点都对应了树上的一条简单路径。

docs/graph/concept.md

0 → 100644
+302 −0

File added.

Preview size limit exceeded, changes collapsed.

+7 −5
Original line number Diff line number Diff line
author: Ir1d, sshwy, GavinZhengOI, Planet6174, ouuan, TrisolarisHD, ylxmf2005

相关阅读: [双连通分量](./bcc.md)

割点和桥更严谨的定义参见 [图论基础](./basic.md)
割点和桥更严谨的定义参见 [图论相关概念](./concept.md)

## 割点

@@ -12,13 +14,13 @@

首先,我们上一个图:

![](images/bridge1.png)
![](./images/bridge1.png)

很容易的看出割点是 2,而且这个图仅有这一个割点。

首先,我们按照 DFS 序给他打上时间戳(访问的顺序)。

![](images/bridge2.png)
![](./images/bridge2.png)

这些信息被我们保存在一个叫做 `num` 的数组中。

@@ -30,7 +32,7 @@

另外,如果搜到了自己(在环中),如果他有两个及以上的儿子,那么他一定是割点了,如果只有一个儿子,那么把它删掉,不会有任何的影响。比如下面这个图,此处形成了一个环,从树上来讲它有 2 个儿子:

![](images/bridge3.png)
![](./images/bridge3.png)

我们在访问 1 的儿子时候,假设先 DFS 到了 2,然后标记用过,然后递归往下,来到了 4,4 又来到了 3,当递归回溯的时候,会发现 3 已经被访问过了,所以不是割点。

@@ -114,7 +116,7 @@ low[u] = min(low[u], num[v]);

## 割边

和割点差不多,叫做桥。
和割点差不多,叫做桥。

> 对于一个无向图,如果删掉一条边后图中的连通分量数增加了,则称这条边为桥或者割边。

+2 −96
Original line number Diff line number Diff line
 **图论(graph theory)** 是数学的一个分支,它以 **图** 为研究的对象。

图论本身是应用数学的一部分,历史上图论曾经被很多数学家各自独立建立过。关于图论的最早文字记载最早出现在欧拉 1736 年的论著中,也就是著名的柯尼斯堡(Konigsberg)问题(七桥问题)。

## 图的定义

一个图 $G$ 是一个二元组,即序偶 $\langle V,E\rangle$ ,或记作 $G= \langle V,E\rangle$ ,其中 $V$ 是有限非空集合,称为 $G$ 的顶点集, $V$ 中的元素称为顶点或结点; $E$ 称为 $G$ 的边的集合, $\forall e_i \in E$ ,都有 $V$ 中的结点与之对应,称 $e_i$ 为 $G$ 的边。

简单来说,就是图 $G$ 就是一个结点的集合 $V$ 和边的集合 $E$ ,其中任意一条边都可以表示为两个结点之间的关系。若 $e_i\in E$ 表示为 $\langle u,v\rangle$ ,则有 $u\in V , v\in V$ 。

## 有向边和无向边

以上定义的结点对 **可以是有序的,也可以是无序的** 。如果边 $e_i$ 和结点无序对 $(u,v)$ 相对应,则称 $e_i$ 为无向边,记作 $e_i=(u,v)$ ,称 $u,v$ 为边 $e_i$ 的两个端点。

如果边 $e_i$ 和结点有序对 $\langle u,v\rangle$ 相对应,则称 $e_i$ 为有向边,记为 $e_i= \langle u,v\rangle$ ,称 $u$ 为边 $e_i$ 的 **始点** , $v$ 为该边的终点。

简单来说,如果边对结点的关系是双向的,那么这条边是无向边;如果是单向的,那么这条边是有向边。

## 图的基本概念

无向图:每条边都是无向边的图。

有向图:每条边都是有向边的图。

混合图:在一个图中,有些边是有向边,另一些边是无向边,则该图为混合图。

有限图:一个图的点集和边集都是有穷集的图。

零图:边集为空集的图。

平凡图:仅有一个结点而没有边构成的图。

关联:若有 $e_i=(u,v)$ 且 $e_i\in E$ ,则称 $u$ 是和 $v$ 相关联的。

孤立点:无边关联的点。

自环:若一条边所关联的两个结点重合,则称此边为自环。

邻接:关联于同一条边的两个点 $u$ 和 $v$ 称为邻接的;关联于同一个点的两条边 $e_1$ 和 $e_2$ 是邻接的(或相邻的)。

## 结点的度数

设图 $G= \langle V,E\rangle$ 为一个有向图, $v\in V$ ,关联于结点 $v$ 的 **边** 的条数,称为点 $v$ 的度数,记作 $\deg(v)$ 。

注意:一个自环为它的端点增加 2 度。

当图 $G= \langle V,E\rangle$ 为一个有向图, $v\in V$ ,称以 $v$ 作为始点的边数之和称为结点 $v$ 的出度,记为 $\deg^{+} (v)$ 。将以 $v$ 作为终点的边数之和称为结点 $v$ 的入度,记为 $\deg^{-} (v)$ 。称以 $v$ 作为端点的边数之和为结点 $v$ 的度数或度,记为 $\deg(v)$ 。

显然, $\forall v\in V,\deg(v)=deg^{+} (v)+\deg^{-} (v)$ 。

### 定理 1

 $\sum_{v\in V} \deg(v)=2\times |E|$ 

推论:在任意图中,度数为奇数的点必然有偶数个。

### 定理 2

 $\sum_{v\in V} \deg^{+} (v)=\sum_{v\in V} \deg^{-} (v)=|E|$ 

即所有点入度之和等于出度之和。

## 子图的概念

设有图 $G= \langle V,E\rangle$ 和图 $G'= \langle V',E'\rangle$ 。

如果 $V'\subseteq V,E'\subseteq E$ ,则称 $G'$ 是 $G$ 的子图,记作 $G'\subseteq G$ 。

如果 $G'\subsetneqq G$ ,即 $V'\subset V$ 或 $E'\subset E$ ,则称 $G'$ 是 $G$ 的真子图,记作 $G'\subset G$ 。

如果 $V'=V,E'\subseteq E$ ,则称 $G'$ 是 $G$ 的生成子图。

如果 $V''\subseteq V$ 且 $V'' \neq \varnothing$ ,以 $V''$ 为结点集,以两端点均在 $V''$ 中的边为边集的 $G$ 的子图,称为 $V''$ 导出的 $G$ 的子图,简称为 $V''$ 的导出子图。

如果 $G''= \langle V'',E''\rangle$ 使得 $E''=E-E'$ ,且 $V''$ 中仅包含 $E''$ 中的边所关联的结点,则称 $G''$ 是子图 $G'$ 相对于原图 $G$ 的补图。

## 特殊的图

树:边数比结点数少一的连通图。更多内容,详见 [树相关基础](./tree-basic.md)

森林:由 $m$ 棵( $m\ge 0$ )互不相交的树组成的图。

基环树:边数和点数相等的连通图。

仙人掌:每条边至多属于一个简单环的无向连通图。

在无向图中,关联一对顶点的边多于 $1$ 条,则称这些边为重边(平行边),重边的条数称为重数。

简单图:不含重边和自环的图。

多重图:含重边的图。

完全图:每对不同的顶点之间都恰连有一条边相连的简单无向图。容易证明, $n$ 个顶点的完全图有 $\dfrac{n(n-1)}{2}$ 条边。

竞赛图:通过在完全图中为每条边分配方向而获得的有向图。
 **图论 (Graph theory)** 是数学的一个分支,图是图论的主要研究对象。 **图 (Graph)** 是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系。

## 参考资料

离散数学(修订版),田文成 周禄新 编著,天津文学出版社,P184-187
 <https://zh.wikipedia.org/wiki/图论> 
Loading