
【基础算法模板】
无
不牌不改
※ 接受自己很普通
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
最近公共祖先模板
倍增法题目链接#include<bits/stdc++.h>using namespace std;const int N = 5e5 + 10;int idx, e[N<<1], ne[N<<1], h[N];int dp[N], fa[N][30];int n, m, s;void add (int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx ++;}void bfs () {原创 2022-03-16 10:00:33 · 220 阅读 · 0 评论 -
最短路算法总结
Dijsktra 模板Bellman_ford 模板SPFA 模板Floyd 模板原创 2022-03-15 22:38:53 · 237 阅读 · 0 评论 -
Floyd 算法模板
题目链接基于动态规划的原理,f[k][i][j]表示通过前k个点从i到j的距离,转移方程f[k][i][j] = f[k-1][i][k] + f[k-1][k][j],含义为用通过前k-1个点从i到达k的距离与通过前k-1个点从k到达j的距离之和更新从前k个点从i到j的距离。第一维度可以忽略。#include<bits/stdc++.h>using namespace std;const int N = 100;int n, e[N][N];int main(){ ci原创 2022-03-15 22:15:08 · 327 阅读 · 0 评论 -
SPFA 算法模板
题目链接SPFA 一般时间复杂度为 O(n)O(n)O(n),最坏情况下为 O(nm)O(nm)O(nm),本质是对 Bellman_ford 算法的优化。可以用于计算正、负边权的最短路,但不能取代 Bellman_ford 计算有步数限制的最短路。思想:在Bellman_ford算法中需要遍历全部的边来更新最短路,但是 d[b] = min (d[b], d[a] + w) 只有在 d[a] 被更新(变小),d[b]才有可能变小,所以我们试图将变小的d[b]对应的b记录下来,只用这些点去更新最短路。原创 2022-03-15 20:57:13 · 615 阅读 · 0 评论 -
Bellman_ford算法解决负边权与有边数限制的最短路问题模板
题目链接#include<bits/stdc++.h>using namespace std;const int N = 510, M = 10010, INF = 0x3f3f3f3f;int n, m, k;int d[N], backup[N];struct edge { int a, b, w;} e[M]; void bellman_ford () { memset (d, 0x3f, sizeof d); // 注意初始化 d[1] = 0;原创 2022-03-15 20:28:59 · 321 阅读 · 0 评论 -
判断是否为拓扑图、求拓扑序列模板
拓扑图的有关知识:广搜的应用针对有向图来说,无向图没有拓扑序列有向无环图一定存在拓扑序列(有向无环图也被称作拓扑图)入度和出度入度为0的点作为拓扑序的起点一个图的拓扑序不一定唯一过程:将入度为0的点入队while(队列不空) { 取出队头t 枚举队头t的所有出边(出边为t -> j) t的入度--(删除t -> j) 判断t的入度是否为0,若为0则将t加入队列}代码#include <bits/stdc++.h>using namespa原创 2022-03-14 20:56:50 · 1043 阅读 · 0 评论 -
逆元模板、求1~n每个数的逆元模板
欧拉定理:若 aaa 和 nnn 互质,则 aφ(n)≡1 (mod n)a^{\varphi(n)}\equiv1\space\space\space(mod\space\space n)aφ(n)≡1 (mod n)欧拉定理的推论(费马定理):在 aaa 和 ppp 互质的前提下,当 ppp 为质数时,ap−1≡1 (mod p..原创 2022-03-14 19:27:18 · 739 阅读 · 1 评论 -
快速幂模板
#include<bits/stdc++.h>using namespace std;int ksm (int a, int k, int p) { int res = 1; while (k) { if (k & 1) res = res * a % p; a = a * a % p; k >>= 1; } return res;}int main(){ int a, k, p; cin >> a >> k &原创 2022-03-14 18:49:29 · 293 阅读 · 0 评论 -
欧拉函数模板
欧拉函数:φ(n)\varphi(n)φ(n)表示1∼n1\sim n1∼n中与nnn互素的个数。互素:两个整数的公因子只有111。假设 nnn 可以表示为 n=P1α1∗P2α2∗...∗Pkαkn=P_1^{\alpha_1}*P_2^{\alpha_2}*...*P_k^{\alpha_k}n=P1α1∗P2α2∗...∗Pkαk,其中 PiP_iPi 均为 nnn 的质因子,那么存在结论 φ(n)=n∗(1−1P1)∗(1−1P2)∗...∗(1−1Pk)\varphi(n) =原创 2022-03-14 14:35:43 · 229 阅读 · 0 评论 -
约数之和模板
假设 nnn 可以表示为 n=P1α1∗P2α2∗...∗Pkαkn=P_1^{\alpha_1}*P_2^{\alpha_2}*...*P_k^{\alpha_k}n=P1α1∗P2α2∗...∗Pkαk,其中 PiP_iPi 均为 nnn 的质因子,那么存在结论 nnn 的约数之和为 (P10+P11+...+P1α1)∗(P20+P21+...+P2α2)∗...∗(Pk0+Pk1+...+Pkαk)(P_1^0+P_1^1+...+P_1^{\alpha_1})*(P_2^0+P_2^原创 2022-03-13 22:02:01 · 339 阅读 · 0 评论 -
约数个数模板
假设 nnn 可以表示为 n=P1α1∗P2α2∗...∗Pkαkn=P_1^{\alpha_1}*P_2^{\alpha_2}*...*P_k^{\alpha_k}n=P1α1∗P2α2∗...∗Pkαk,其中 PiP_iPi 均为 nnn 的质因子,那么存在结论 nnn 的约数的个数为 (α1+1)∗(α2+1)∗...∗(αk+1)(\alpha_1+1)*(\alpha_2+1)*...*(\alpha_k+1)(α1+1)∗(α2+1)∗...∗(αk+1)。大致证明如下:由原创 2022-03-13 21:31:53 · 313 阅读 · 0 评论 -
Dijkstra 算法(非负边权单源最短路算法)模板
#include<bits/stdc++.h>#define PII pair <int, int>#define x first#define y secondusing namespace std;const int N = 1e5+10;priority_queue <PII, vector <PII>, greater <PII> > q; // 小根堆 int idx, w[N<<1], e[N<<原创 2022-03-13 17:42:57 · 669 阅读 · 0 评论 -
多个数计算最大公约数与最小公倍数的模板
计算多个数的最大公约数的算法思路:计算前两个数是最大公约数,记为gcd,再计算gcd与第三个数的最大公约数,更新gcd为本次计算的最大公约数,再计算gcd与第四个数的最大公约数,更新gcd为本次计算的最大公约数,……#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;int a[N], cnt;int main(){ while (cin >> a[cnt]) cnt ++; in原创 2022-03-12 21:20:11 · 317 阅读 · 0 评论 -
辗转相除法最简易的模板
#include<bits/stdc++.h>using namespace std;int a, b;int main(){ cin >> a >> b; if (a == 0 || b == 0) return 0; // 一方为0,无最大公约数 if (a > b) swap (a, b); // 保证 a<b while (b) swap (a = a % b, b); // 辗转相除法 cout << a原创 2022-03-12 21:12:40 · 335 阅读 · 0 评论 -
最长上升子序列模板与优化后的模板
未优化#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;int n, ans;int a[N], f[N];int main(){ cin >> n; for (int i = 1;i <= n;i ++) { cin >> a[i]; f[i] = 1; for (int j = 1;j < n;j ++) if (a[i] > a[原创 2022-03-11 19:34:39 · 221 阅读 · 0 评论 -
约瑟夫环代码模板
约瑟夫环代码。详见#include<iostream>#include<stdio.h>using namespace std;int yuesefu(int n,int m){ if(n == 1){ return 0; //这里返回下标,从0开始,只有一个元素就是剩余的元素0 } else{ return (yuesefu(n-1,m) + m) % n;原创 2022-03-11 18:05:59 · 172 阅读 · 0 评论 -
DFS 显示n个数中选取i(0~n)个数的情况
#include<bits/stdc++.h>using namespace std;int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int vis[10];int n = 10, ans;void dfs (int x) { if (x == n) { for (int i = 0;i < n;i ++) if (vis[i]) cout << a[i] << ' '; cout <<原创 2022-03-10 21:11:43 · 212 阅读 · 0 评论 -
DFS 二维空间统计四连通区域个数,并返回每个连通区域中的节点个数
#include<bits/stdc++.h>using namespace std;// dfs 二维空间统计四连通区域个数,并返回每个连通区域中的节点个数 int n = 3, m = 3, ans;int vis[100], mp[100];int dfs (int x, int y) { // 这个函数必须要传入行号和列号,不能传入降维至一维的编号 if (x < 0 || x >= n || y < 0 || y >= m) return 0原创 2022-03-10 17:51:32 · 649 阅读 · 0 评论 -
DFS 输出从n个数中选m个数的全部情况
#include<bits/stdc++.h>using namespace std;int vis[10], n = 4, m = 3;void dfs (int x, int sum) { if (x > n) return ; // 不是 x>=n!!! // 因为x=n说明轮到了选或不选第n个数,但是没判断此时sum的值 if (sum == m) { for (int i = 0;i < n;i ++) if (vis[i]) c原创 2022-03-10 17:37:38 · 661 阅读 · 0 评论 -
邻接表的存储
邻接表原创 2022-01-13 11:13:13 · 358 阅读 · 0 评论 -
二分查找模板
情况一:找最小的可行解找到某个值,比其小的值均不满足题意,比其大的值均满足题意。int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; else l = mid + 1; } return l;}情况二:找最大的可行解找到某个值,比其大的值均不满足题意,比其小的值均满原创 2022-03-08 14:20:45 · 237 阅读 · 2 评论 -
算法题中实现计算排列数与组合数
知识背景排列数公式:Anm=n×(n−1)×...×(n−m+1)=n!(n−m)!A_n^m = n×(n-1)×...×(n-m+1) = \frac{n!}{(n-m)!}Anm=n×(n−1)×...×(n−m+1)=(n−m)!n!组合数公式:Cnm=n×(n−1)×...×(n−m+1)m×(m−1)×...×1=n!m! (n−m)!C_n^m = \frac{n×(n-1)×...×(n-m+1)}{m×(m-1)×...×1} = \frac{n!}{m!\space(n原创 2022-03-07 11:31:32 · 706 阅读 · 0 评论 -
分解质因数模板
#include<bits/stdc++.h>using namespace std;int n;vector <int> primefactor;int main(){ cin >> n; for (int i = 2;i * i <= n;i ++) { if (n % i == 0) { primefactor.push_back (i); while (n % i == 0) n /= i; // 可以进行统计个数原创 2022-03-07 15:10:40 · 177 阅读 · 0 评论 -
试除法判定质数模板题
试除法判定一个数是否为质数类似于这道题:代码:#include<bits/stdc++.h>using namespace std;int main(){ cin >> n; for (int i = 2;i * i <= n;i ++) { if (n % i == 0) { cout << "no" << endl; return 0; } } cout << "yes" << en原创 2022-03-07 20:48:48 · 154 阅读 · 0 评论 -
高精度模板
高精度加法题目链接#include<bits/stdc++.h>using namespace std;const int N = 100;string s1, s2;int a[N], b[N]; // 也可以使用vector int main(){ cin >> s1 >> s2; reverse (s1.begin(), s1.end()); reverse (s2.begin(), s2.end()); int n = s1.size()原创 2022-03-06 14:15:57 · 254 阅读 · 0 评论 -
试除法求全部约数的模板
试除法求全部约数类似于下面这道题:代码:#include<bits/stdc++.h>using namespace std;int n;vector <int> ans;int main(){ cin >> n; for (int i = 1;i * i <= n;i ++) { if (n % i == 0) { ans.push_back(i); if (n / i != i) ans.push_back(n / i);原创 2022-03-07 20:43:23 · 170 阅读 · 0 评论