数据结构与算法
文章平均质量分 57
关于各种数据结构与各类算法
SP FA
我永远喜欢洛天依
展开
-
算法整理 & 复习
一、排序 二、高精度运算 三、树 四、数据结构 五、图论 六、动态规划 七、数论 暂时先这些,以后一点一点补充原创 2020-09-29 19:32:48 · 471 阅读 · 3 评论 -
算法整理 & 复习:Manacher 算法
这要从一道题目说起 力扣 5. 最长回文子串 这道题最好想的做法就是中心扩展,设字符串为 SSS,dp(i, j) 记录 从 i 到 j 是否是回文串,那么就有:{dp(i, j)=dp(i+1, j−1)∧(Si==Sj)dp(i, i)=1\begin{cases} dp(i,~j)=dp(i+1,~j-1)\land (S_i==S_j)\\dp(i,~i)=1\end{cases}{dp(i, j)=dp(i+1, j−1)∧(Si==Sj)dp原创 2022-01-18 10:26:51 · 294 阅读 · 0 评论 -
算法整理 & 复习:背包九讲
文章目录一、01 背包 一、01 背包 01背包问题 #include <stdio.h> #include <iostream> using namespace std; #define MAXN 1005 int n, m; int bag[MAXN]; int val[MAXN], wight[MAXN]; int main(void) { cin >> n >> m; for (int i=1;i<=n;i++)原创 2021-11-03 11:43:44 · 110 阅读 · 0 评论 -
算法整理 & 复习:网络流 24 题
文章目录一、最大流 & 最小割问题1. 模板1.1 Ford-Fulkerson1.2 Edmond-Karp1.3 Dinic2. 题目(1) P2756 飞行员配对方案问题二、最小费用最大流问题1. 模板 一、最大流 & 最小割问题 1. 模板 P3376 【模板】网络最大流 1.1 Ford-Fulkerson 由于这个算法复杂度玄学,所以会 T 掉两个点。 #include <stdio.h> #include <string.h> #inclu原创 2021-03-25 13:42:26 · 889 阅读 · 0 评论 -
算法整理 & 复习:Treap
文章目录一、普通平衡树二、不储存索引的平衡树 一、普通平衡树 P3369 【模板】普通平衡树 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <iostream> using namespace std; #define MAXN 100005 struct Treapnode { int l, r; int val, key; int siz原创 2021-02-07 20:28:05 · 112 阅读 · 0 评论 -
算法整理 & 复习:欧拉图
文章目录一、Hierholzer 算法二、Fleury 算法 一、Hierholzer 算法 ① 对于全部偶数度数的图来说,起始节点是任意的。 ② 如果存在奇数点,那么一定从奇数点开始。 ③ 如果存在两个奇数点,那么一定从一个奇数点开始一个奇数点结束。 P2731 [USACO3.3]骑马修栅栏 Riding the Fences #include <stdio.h> #include <iostream> using namespace std; #define MAXN原创 2021-02-02 16:53:29 · 279 阅读 · 0 评论 -
算法整理 & 复习:差分约束
差分约束 P5960 【模板】差分约束算法 #include <stdio.h> #include <iostream> using namespace std; #define MAXN 100005 int cnt, n, m; int head[MAXN], num[MAXN]; struct node{ int to,next,w; }map[MAXN]; void add(int u,int v,int w){ map[++cnt] = (node原创 2021-02-02 13:08:26 · 117 阅读 · 0 评论 -
算法整理 & 复习:KM算法
文章目录一、DFS 式 KM 算法二、BFS 式 KM 算法 一、DFS 式 KM 算法 P1559 运动员最佳匹配问题 #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define MAXN 25 int visL[MAXN], visR[MAXN], valueL[MAXN], valueR[MAXN]; int map[MAXN][MAXN]原创 2021-02-01 18:10:05 · 179 阅读 · 0 评论 -
算法整理 & 复习:匈牙利算法
匈牙利算法用于二分图最大匹配 文章目录匈牙利算法 匈牙利算法 P6268 [SHOI2002]舞会 #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define MAXN 2005 int n,m,ans; int vis[MAXN]; int col[MAXN]; int match[MAXN]; int map[MAXN][MAXN]; v原创 2021-01-28 11:43:10 · 479 阅读 · 0 评论 -
算法整理 & 复习:Splay
旋转规则: 一:Zig 此时节点 u 是 root v 是左孩子:右旋 v 是右孩子:左旋 二:Zig_Zig ( v , u 同侧,先 u 再 v) 此时节点 u 不是 root v 与 u 同为左孩子: 右旋两次 v 与 u 同为右孩子: 左旋两次 三:Zig_Zag ( v ,u 异侧,先 v 再 u) 此时节点 u 不是 root v 是左孩子,u 是右孩子:v 先右旋,再左旋 v 是右孩子,u 是左孩子:v 先左旋,再右旋 ...原创 2021-01-27 19:21:54 · 166 阅读 · 0 评论 -
算法整理 & 复习:树链剖分
树链剖分多与线段树结合使用。 模板 void dfs1(int u, int FA, int depth) { dep[u] = depth; fa[u] = FA; size[u]++; for (int k = head[u];k;k = map[k].next) { int v = map[k].to; if (v == FA) { continue; }原创 2021-01-21 22:04:48 · 117 阅读 · 0 评论 -
算法整理 & 复习:字典树
字典树(trie树) #include <stdio.h> #include <iostream> using namespace std; #define ASC c[i]-'a' int sum[MAXN],vis[MAXN]; int trie[MAXN][26]; void insert(){ int u = 0; for(int i=0;c[i];i++){ if(!trie[u][ASC]) trie[u][ASC]原创 2020-12-15 19:13:07 · 108 阅读 · 0 评论 -
算法整理 & 复习:珂朵莉树
珂朵莉树 #include <set> #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; #define IT set<node> :: iterator #define ilL itl->L #define ilR itl->R #define ilw itl->w struct node{ int L,R;原创 2020-12-15 18:55:36 · 131 阅读 · 0 评论 -
算法整理 & 复习:树上倍增
树上倍增 P3379 【模板】最近公共祖先(LCA) #include <math.h> #include <stdio.h> #include <iostream> using namespace std; #define MAXN 500005 int prn,cnt,n,m,s; int head[MAXN],fa[MAXN][20],dep[MAXN]; struct node{ int to,next; }map[2*MAXN]; void add(i原创 2020-12-15 18:24:45 · 126 阅读 · 0 评论 -
算法整理 & 复习:割点、割边
文章目录一、割点(割顶)二、割边(桥) 一、割点(割顶) P3388 【模板】割点(割顶) #include <stdio.h> #include <iostream> using namespace std; #define MAXN 200005 int n,m; int cnt,flag; int head[MAXN]; int dfn[MAXN],low[MAXN],cut[MAXN]; struct node{ int to,next; }map[MAXN];原创 2020-12-13 13:34:52 · 266 阅读 · 0 评论 -
算法整理 & 复习:连通分量
文章目录一、连通图二、连通分量三、强连通图四、强连通分量 一、连通图 若无向图 GGG 中任意两个不同的顶点 ViV_iVi 和 VjV_jVj 都连通(即有路径),则称 GGG 为连通图(Connected Graph)。 二、连通分量 无向图G的极大连通子图称为G的连通分量 三、强连通图 有向图 GGG 中,若对于任意两个不同的顶点 ViV_iVi 和 VjV_jVj ,都有 ViV_iVi 到 VjV_jVj 及 VjV_jVj 到 ViV_iVi 的路径,则称 GG原创 2020-12-12 18:40:34 · 1053 阅读 · 0 评论 -
算法整理 & 复习:拓扑排序
拓扑排序 int in[MAXN]; void topsort(){ queue <int>que; for(int i=1;i<=n;i++){ if(!in[i]) que.push(i); } while(!que.empty()){ int u = que.front(); que.pop(); for(int k=head[u];k;k=map[k].next){ int v = map[k].to; int w = map[k].w;原创 2020-12-11 18:24:35 · 97 阅读 · 0 评论 -
算法整理 & 复习:最小生成树
文章目录一、Kruskal二、Prim 一、Kruskal P3366 【模板】最小生成树 #include <stdio.h> #include <algorithm> #include <iostream> using namespace std; #define MAXN 200005 int n,m,cnt,flag,ans; struct node{ int u,v,w; }map[MAXN]; void add(int u, int v, int原创 2020-12-09 23:33:07 · 108 阅读 · 0 评论 -
算法整理 & 复习:最短路、次短路
文章目录一、SPFA二、dfs 版 SPFA 一、SPFA P3371 【模板】单源最短路径(弱化版) void SPFA(int s){ memset(dis,0x3f,sizeof(dis)); queue <int>que; que.push(s); vis[s] = 1; dis[s] = 0; while(!que.empty()){ int u = que.front(); vis[u] = 0; que.pop(); for(int k=head原创 2020-12-07 22:08:06 · 152 阅读 · 0 评论 -
算法整理 & 复习:线段树、线段树合并
文章目录一、线段树1. 线段树基础(1) 定义(2) 下传函数及建树(3) 单点修改、单点查询(4) 区间修改、区间查询2. 线段树求区间最值(1) 下传函数及建树(2) 单点修改(3) 区间修改、区间查询3. 线段树求区间连续最大子段和(1) 定义(2) 更新函数及建树(3) 单点修改(4) 区间查询4. 区间平均数、方差(1) 定义(2) 下传函数、更新函数及建树(3) 区间修改、区间查询5. 线段树求最长严格上升子序列(subsequence)(1) 定义(2) 更新函数及建树(3) 单点修改6. 区原创 2020-11-28 13:21:34 · 480 阅读 · 0 评论 -
算法整理 & 复习:哈希、哈希冲突
文章目录哈希 哈希 P3370 【模板】字符串哈希 #include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> using namespace std; long long prime=10000000007; long long p=10000000009; long long base=1381; long long a[10010]; char str原创 2020-11-22 16:26:51 · 214 阅读 · 0 评论 -
算法整理 & 复习:并查集、带权并查集
文章目录一、并查集二、带权并查集三、并查集的优化1. 路径压缩2. 按秩合并 一、并查集 P3367 【模板】并查集 //骞舵煡闆? #include <stdio.h> #include <iostream> using namespace std; #define MAXN 10005 int prn[MAXN]; int n,m,p,x,y; int find(int x){ if(prn[x] == x) return x; return prn[x] = fi原创 2020-11-21 12:13:11 · 221 阅读 · 0 评论 -
算法整理 & 复习:堆
文章目录一、大顶堆二、小顶堆 一、大顶堆 二、小顶堆 P3378 【模板】堆 #include <stdio.h> #include <iostream> using namespace std; #define MAXN 1000005 int heap[MAXN]; int n,op,num,heapSize; void Insert(int x){ heap[++heapSize] = x; int u = heapSize; int fa = u>原创 2020-11-19 19:12:59 · 92 阅读 · 0 评论 -
算法整理 & 复习:栈、单调栈
文章目录一、栈二、单调栈 一、栈 P1165 日志分析 #include <stdio.h> #include <iostream> using namespace std; #define MAXN 200005 struct Stack{ int stk[MAXN]; int tp; Stack(){ tp = 0; } bool empty(){ if(!tp) return 1; return 0; } int size(){ ret原创 2020-11-18 21:42:48 · 121 阅读 · 0 评论 -
算法整理 & 复习:队列、单调队列、双端队列
文章目录一、队列二、单调队列三、双端队列 一、队列 struct Queue{ int que[MAXN]; int head,rear; Queue(void){ head = 1; rear = 1; } bool empty(){ if(head == rear) return 1; return 0; } void push(int a){ que[rear++] = a; } int pop(){ if(head+1>rear) return原创 2020-11-06 01:40:54 · 202 阅读 · 0 评论 -
算法整理 & 复习:链表、双向链表
文章目录一、单向链表1. 链表结点的定义2. 插入结点3. 删除结点4. 查找结点5. 链表的逆置6. 查找倒数第 k 个结点7. 判断是否有环8. 查找环的入口9. 测试程序二、双向链表 一、单向链表 1. 链表结点的定义 int ListLen; // 链表长度 struct ListNode{ int data; ListNode *next; }; 2. 插入结点 void InsertNode(ListNode *hd, ListNode *a, int x){ if(x&g原创 2020-10-31 18:14:08 · 589 阅读 · 0 评论 -
算法整理&复习:树状数组
文章目录二叉树的遍历树状数组线段树树链剖分倍增字典树平衡树珂朵莉树 二叉树的遍历 树状数组 线段树 树链剖分 倍增 字典树 平衡树 珂朵莉树原创 2020-10-29 13:08:32 · 107 阅读 · 0 评论 -
算法整理&复习:高精度
文章目录高精度读取高精度加法高精度减法高精度乘法高精度除法 高精度读取 #include <string.h> int a[MAXN],b[MAXN]; char stra[MAXN],strb[MAXN]; void read(void){ cin >> stra >> strb; int lena = strlen(stra); int lenb = strlen(strb); for(int i=0;i<lena;i++) a[lena-i] =原创 2020-10-04 17:19:33 · 92 阅读 · 0 评论 -
算法整理&复习:排序
文章目录选择排序冒泡排序插入排序快速排序求第 k 小的数结构体排序字符串排序 选择排序 冒泡排序 P1059 明明的随机数 #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int n; int a[101]; void bubble_sort(int *arr){ for(int i=0;i<n;i++) for(int j=0;j原创 2020-09-30 15:43:13 · 115 阅读 · 0 评论