CSP-S 2019初赛知识点总结之图论

图论

理论知识

来自这里

基本概念

完全图:任意两点都有边相连,我们很容易推出来,一张完全图的边数为(n为节点个数)
n × ( n − 1 ) 2 \frac{n×(n−1)}{2} 2n×(n1)

连通图:顾名思义,连通图就是连通的图,即任意两点都能直接或间接到达,这就区别于完全图必须直接用边到达的定义。

:emm…直观来讲,就是一张长得像树的图。定义是任意两点之间的简单路径有且只有一条。树是一棵连通且无环的图。它的边数是n−1。(所以两个节点之间的最长路径即为最短路径)

无向图中:顶点v的度是指与顶点v相连的边的数目D(v)。

有向图中:

入度——以该顶点为终点的边的数目和

出度——以该顶点为起点的边的数目和

度数为奇数的顶点叫做奇点,度数为偶数的点叫做偶点

度:等于该顶点的入度与出度之和。

任意一个图的总度数等于其边数的2倍

连通

如果在同一无向图中两个结点存在一条路径相连,则称这两个结点连通。

连通图:如果无向图中任意两个结点都是连通的,则称之为连通图。

强连通/强连通图:

如果有向图中任意两个结点之间存在两条路径(即(i,j)两点中,既从i到j有一条路径,j到i也有一条路径),则两点是强连通的。当一个图中任意两点间都是强连通的,则该图称之为强连通图。

在强连通图中,必定有一条回路经过所有顶点。

强连通分量:非强连通图有向图中的最大子强连通图。单个点也算强连通分量

回路

起点与相同的路径,又叫“环”。

完全图

任意两点间都存在边使其相连的无向图或任意两点间都存在两条不同边的有向图称作完全图

N个顶点的完全图:

有向 有 n ( n − 1 ) n(n-1) n(n1)条边

无向 有 n ∗ ( n − 1 ) 2 \frac{n*(n-1)}{2} 2n(n1)条边

存储方式

1.邻接矩阵

2.邻接表(适用于稀疏图)

3.边集数组(适用于稀疏图)

4.前向星(可以被邻接表代替)

欧拉图:可以一笔画出来的图

一个图是欧拉图的充要条件(无向图):度为奇数点的点的个数<=2

相关定义:

欧拉环游(欧拉回路):通过图中每边恰好一次的闭路径

无向图存在欧拉回路的充要条件

一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。

有向图存在欧拉回路的充要条件

一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。

欧拉闭迹(欧拉路):通过图中每边恰好一次的路径

无向连通图存在欧拉路的条件:

所有点度都是偶数,或者恰好有两个点度是奇数,则有欧拉路。

若有奇数点度,则奇数点度点一定是欧拉路的起点和终点,否则可取任意一点作为起点。

有向连通图存在欧拉路的条件:

每个点的入度等于出度,则存在欧拉回路(任意一点有度的点都可以作为起点)

除两点外,所有入度等于出度。这两点中一点的出度比入度大,另一点的出度比入度小,则存在欧拉路。取出度大者为起点,入度大者为终点。

单源最短路

Dijkstra(迪杰斯特拉算法)

无负权

O ( ∣ V ∣ 2 ) O(|V|^{2}) O(V2) 对稠密图好

堆优化 : O ( ∣ E ∣ ∗ l o g ∣ V ∣ ) O(|E|*log|V|) O(ElogV) 对稀疏图好

Bellman-ford算法

用的是边表

有负权 ,但无负环

O ( ∣ V ∣ ⋅ ∣ E ∣ ) O(|V|·|E|) O(VE)

可判负环

SPFA

是Bellman-ford算法用队列优化的算法

有负权,但无负环

最坏情况下复杂度和Bellman-ford相同

(如何卡SPFA算法:搞个⾏很少的⽹格图,竖着的边权很⼩,横着的边权很⼤)

具体可见https://blog.csdn.net/yfzcsc/article/details/77623365

判断是否存在负环

• 判断最短路的边数是否>n

• 判断⼀个点是否⼊队超过 n 次

全源最短路

Floyed(弗洛伊德算法)

可以有负权,但无负环

O ( ∣ V ∣ 3 ) O(|V|^{3}) O(V3)

最小生成树(MST)

来自这里

生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。

最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。

Prim(普里姆算法)

普通方法 O ( ∣ V ∣ 2 ) O(|V|^{2}) O(V2)

用堆 O ( ∣ E ∣ + ∣ V ∣ ∗ l o g ∣ V ∣ ) O(|E|+|V|*log|V|) O(E+VlogV) 对稀疏图较好

此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。

1.图的所有顶点集合为 V V V;初始令集合 u = u = u= { s s s} , v = V − u v=V−u v=Vu;

2.在两个集合u,v能够组成的边中,选择一条代价最小的边(u0,v0),加入到最小生成树中,并把v0并入到集合u中。

3.重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止。

Kruskal(克鲁斯卡尔)

O ( ∣ E ∣ ∗ l o g ∣ E ∣ + ∣ N ∣ ∗ A ( ∣ V ∣ ) ) O(|E|*log|E|+|N|*A(|V|)) O(ElogE+NA(V)) 对稀疏图较好

此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。

1.把图中的所有边按代价从小到大排序;

2.把图中的n个顶点看成独立的n棵树组成的森林;

3 按权值从小到大选择边,所选的边连接的两个顶点ui, vi应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。

4.重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。

二叉树的遍历

二叉树有不同的遍历方式,一般来讲,我们将其分成三类:先序遍历(也叫先根遍历)、中序遍历(中根遍历)以及后序遍历(后根遍历)。

先序遍历:遍历方式如下:根—左儿子—右儿子

中序遍历:遍历方式如下:左儿子—根—右儿子

后序遍历:遍历方式如下:左儿子—右儿子—根

一个推论:

先序遍历+中序遍历=一棵确定的二叉树

后序遍历+中序遍历=一棵确定的二叉树

先序遍历+后序遍历=啥也不是

二叉树的性质

1.二叉树第i层上的节点数目最多为 2 i − 1 ( i > = 1 ) 2^{i-1}(i>=1) 2i1(i>=1)

2.深度为k的二叉树至多有 2 k − 1 2^{k} - 1 2k1个节点(k >= 1)

3.二叉树中,叶子节点数为n0,度为2的节点数为n2,则n0=n2+1

特殊二叉树及其性质

完全二叉树:只有最后一层不是满的,且最后一层的所有节点均集中在左侧。

满二叉树:节点个数已满。

平衡二叉树:空树,或者任一结点左、右子树高度差的绝对值不超过1

特殊二叉树的性质:

1、对于一棵完全二叉树来讲,它的叶子节点为n,则节点总数为 2 × n − 1 2×n−1 2×n1。此结论可逆。

2、对于一棵满二叉树来讲,它的层数(深度)为k,则它的节点总数为 2 k − 1 2^{k}−1 2k1。每层节点数为 2 i − 1 ( i > = 1 ) 2^{i-1}(i>=1) 2i1(i>=1),此结论可逆。

特点

1.满二叉树是完全二叉树,完全二叉树不一定是满二叉树

2.在满二叉树的最下层中,从右边看是连续删去若干节点后得到的二叉树仍然是一棵完全二叉树

3.如果对一棵有n个结点的完全二叉树的结点按层序编号,对任一结点i有:

如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点i/2,向下取整

如果2i>n,则结点i无左孩子;否则其左孩子是结点2i

如果2i+1>n,则结点i无右孩子,否则其右孩子是结点2i+1

哈夫曼树和哈夫曼编码

当树中的节点被赋予一个表示某种意义的数值,我们称之为该节点的权。

从树的根节点到任意节点的路径长度(经过的边数)与该节点上权值的乘积称为该节点的带权路径长度。

树中所有叶节点的带权路径长度之和称为该树的带权路径长度(WPL)。

当带权路径长度最小的二叉树被称为哈夫曼树,也称为最优二叉树。

哈夫曼树构造

哈夫曼树在构造时每次从备选节点中挑出两个权值最小的节点进行构造,每次构造完成后会生成新的节点,将构造的节点从备选节点中删除并将新产生的节点加入到备选节点中。新产生的节点权值为参与构造的两个节点权值之和。

哈夫曼编码

利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子结点都有一条路径,对路径上的各分支约定指向左子树的分支表示”0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为各个叶子结点对应的字符编码,即是哈夫曼编码。

带权路径长度可以看做最终编码的二进制长度。

CSP-S 2019初赛知识点总结之图论_第1张图片

你可能感兴趣的:(初赛总结)