Cpp算法-图论-Kruskal
说明
ufs[], find(int), unionn(int, int)并查集结构edge[]链式前向星cmp(Edge, Edge)边排序方案
实现
1 | const int maxn = 1010; |
ufs[], find(int), unionn(int, int)并查集结构edge[]链式前向星cmp(Edge, Edge)边排序方案
1 | const int maxn = 1010; |
例:洛谷P3375
pre()求前缀数组kmp()匹配字符串
1 | char s1[1000010], s2[1000010]; |
例:洛谷P4305
hash[]哈希表find(int x)查找哈希表中 $x$ 的位置push(int x)将 $x$ 插入到哈希表中check(int x)查找 $x$ 是否在哈希表中
1 |
|
例:洛谷P3370
1 | typedef unsigned long long ULL; |
1 | typedef unsigned long long ULL; |
1 | typedef unsigned long long ULL; |
1 | typedef unsigned long long ULL; |
n, m, G[][]点数、边数、邻接矩阵dist[][]每对顶点间路径长度pre[][]每对顶点之间路径make()建图
1 | const int maxn = 110; |
G[][]邻接矩阵deg[]度ans[]欧拉回路n, e点数、边数
1 | int G[maxn][maxn], deg[maxn], ans[maxn]; |
n, m点数、边数head, edge[]链式前向星ans[], ansi路径、数组大小vis[]记录make()建图
1 | int head[maxn]; |
待完成
1 | graph LR |
!!! tldr “题目及注解”
求上图从 $A$ 到 $E$ 的最短距离
$K$: 阶段
$D(X_I, (X+1)_J)$: 从 $X_I$ 到 $(X+1)_J$ 的距离
$F_K(X_I)$: $K$ 阶段下 $X_I$ 到终点 $E$ 的最短距离
倒推:
$$
K=4\qquad F_4(D_1)=3\qquad F_4(D_2)=4\qquad F_4(D_3)=3
$$
$$
K=5\qquad F_3(C_1)=min(D(C_1,D_1)+F_4(D_1),D(C_1,D_2)+F_4(D_2))=min(5+3,6+4)=8
F_3(C_2)
$$
n, m点数、边数G[][]邻接矩阵存图dist[]路径长度pre[]路径make()建图
1 | const int maxn = 10010; |
1 | struct Edge |
1 | int q = n, p[maxm]; |
模板:洛谷P3374
tree[]树状数组lowbit(int)神奇的函数add(int x, int k)第 $x$ 个数加上 $k$ sum(int x)前 $x$ 个数的和
1 | int tree[2000010]; |