摘要:最小割 割 对于一个网络G=(V,E),割就是点的划分方式,将所有点划分为S和T=V-S两个集合。 割的容量 我们定义割(S,T)的容量c(S,T)表示所有的S到T的边的容量之和。 最小割 最小割就是求得一个割(S,T)使得割的容量c(S,T)最小。 最大流最小割定理 f(S,T)max = c(S
阅读全文
摘要:最大流 定义 我们有一张图,要求从源点流向汇点的最大流量(可以有很多条路到达汇点),就是我们的最大流问题。 EK算法 #define maxn 250 #define INF 0x3f3f3f3f struct Edge { int from, to, cap, flow; Edge(int u,
阅读全文
摘要:最短路 floyd for (k = 1; k <= n; k++) { for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { f[k][i][j] = min(f[k - 1][i][j], f[k - 1][i][k] + f[k - 1][
阅读全文
摘要:马拉车算法 模板 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<vector> using namespace st
阅读全文
摘要:割点 /* 洛谷 P3388 【模板】割点(割顶) */ #include <bits/stdc++.h> using namespace std; int n, m; // n:点数 m:边数 int num[100001], low[100001], inde, res; // num:记录每个
阅读全文
摘要:强连通分量 定义 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通。 强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图。 Tarjan算法 int dfn[N], low[N], dfncnt, s[N], in_stack[N
阅读全文
摘要:2-SAT SAT是适定性(Satisfiability)问题的简称。一般形式为k-适定性问题简称 k-SAT。可以证明,当k>2时,k-SAT是NP完全的.因此一般讨论的是k=2的情况,即2-SAT问题 适定性问题 数学术语适定性问题来自于哈达玛所给出的定义。他认为物理现象中的数学模型应该具备下述
阅读全文
摘要:二分图判定 怎么判定一个图是否为二分图 从其中一个定点开始,将跟它邻接的点染成与其不同的颜色,最后如果邻接的点有相同颜色,则说明不是二分图,每次用bfs遍历即可。 #include<iostream> #include<cstdio> #include<algorithm> #include<cst
阅读全文
摘要:二分图最大匹配 模板 #include <bits/stdc++.h> using namespace std; struct augment_path { vector<vector<int> > g; vector<int> pa; // 匹配 vector<int> pb; vector<in
阅读全文
摘要:声明 本文主要是一些代码,加一些例题,基本为模板,仔细内容讲解会给出其他博主的链接 如果想要知道一个字符串是否在另一个字符串中出现过,那么首先想到的就是暴力枚举 #include<iostream> #include<cstdio> #include<cstring> #include<algori
阅读全文
摘要:树链刨分 代码 第一个 DFS 记录每个结点的父节点(father)、深度(deep)、子树大小(size)、重子节点(hson)。 第二个 DFS 记录所在链的链顶(top,应初始化为结点本身)、重边优先遍历时的 DFS 序(dfn)、DFS 序对应的节点编号(rank)。 void dfs1(i
阅读全文
摘要:树的重心 // 这份代码默认节点编号从 1 开始,即 i ∈ [1,n] int size[MAXN], // 这个节点的“大小”(所有子树上节点数 + 该节点) weight[MAXN], // 这个节点的“重量” centroid[2]; // 用于记录树的重心(存的是节点编号) void Ge
阅读全文
摘要:最近公共祖先(LCA) 倍增算法 #include <cstdio> #include <cstring> #include <iostream> #include <vector> #define MXN 50007 using namespace std; std::vector<int> v[
阅读全文
摘要:树的直径 做法一:两次DFS const int N = 10000 + 10; int n, c, d[N]; vector<int> E[N]; void dfs(int u, int fa) { for (int v : E[u]) { if (v == fa) continue; d[v]
阅读全文
摘要:逆元 扩展欧几里得 void exgcd(int a, int b, int &x, int &y) { if (b == 0) { x = 1, y = 0; return; } exgcd(b, a % b, y, x); y -= a / b * x; } 快速幂 inline int qpo
阅读全文
摘要:线性筛(欧拉筛) void init() { phi[1] = 1; for (int i = 2; i < MAXN; ++i) { if (!vis[i]) { phi[i] = i - 1; pri[cnt++] = i; } for (int j = 0; j < cnt; ++j) { i
阅读全文
摘要:单调队列 单调队列是一种主要用于解决滑动窗口类问题的数据结构,即,在长度为n的序列中,求每个长度为m的区间的区间最值。 //得到的是一个单调递减的队列 deque<int> Q; // 存储的是编号 for (int i = 0; i < n; ++i) { if (!Q.empty() && i
阅读全文
摘要:单调栈 单调栈是一种和单调队列类似的数据结构。单调队列主要用于 解决滑动窗口问题,单调栈则主要用于 解决NGE问题(Next Greater Element),也就是,对序列中每个元素,找到下一个比它大的元素。(当然,“下一个”可以换成“上一个”,“比它大”也可以换成“比他小”,原理不变。) 我们维
阅读全文
摘要:线段树 介绍 线段树(Segment Tree)几乎是算法竞赛最常用的数据结构了,它主要用于维护区间信息(要求满足结合律)。 建立 void build(ll l = 1, ll r = n, ll p = 1) { if (l == r) // 到达叶子节点 tree[p] = A[l]; //
阅读全文
摘要:ST表(Sparse Table,稀疏表)是一种简单的数据结构,主要用来解决RMQ(Range Maximum/Minimum Query,区间最大/最小值查询)问题。 //进行预处理,计算区间最大值 int f[MAXN][21]; // 第二维的大小根据数据范围决定,不小于log(MAXN) f
阅读全文