数据结构与算法
文章平均质量分 57
关于各种数据结构与各类算法
SP FA
我永远喜欢洛天依
展开
-
算法整理 & 复习
一、排序二、高精度运算三、树四、数据结构五、图论六、动态规划七、数论暂时先这些,以后一点一点补充原创 2020-09-29 19:32:48 · 1437 阅读 · 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 · 317 阅读 · 0 评论 -
算法整理 & 复习:背包九讲
文章目录一、01 背包一、01 背包01背包问题#include <stdio.h>#include <iostream>using namespace std;#define MAXN 1005int 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 · 246 阅读 · 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 · 1018 阅读 · 0 评论 -
算法整理 & 复习:Treap
文章目录一、普通平衡树二、不储存索引的平衡树一、普通平衡树P3369 【模板】普通平衡树#include <stdio.h>#include <stdlib.h>#include <time.h>#include <iostream>using namespace std;#define MAXN 100005struct Treapnode{ int l, r; int val, key; int siz原创 2021-02-07 20:28:05 · 166 阅读 · 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 · 308 阅读 · 0 评论 -
算法整理 & 复习:差分约束
差分约束P5960 【模板】差分约束算法#include <stdio.h>#include <iostream>using namespace std;#define MAXN 100005int 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 · 150 阅读 · 0 评论 -
算法整理 & 复习:KM算法
文章目录一、DFS 式 KM 算法二、BFS 式 KM 算法一、DFS 式 KM 算法P1559 运动员最佳匹配问题#include <stdio.h>#include <string.h>#include <iostream>using namespace std;#define MAXN 25int visL[MAXN], visR[MAXN], valueL[MAXN], valueR[MAXN];int map[MAXN][MAXN]原创 2021-02-01 18:10:05 · 236 阅读 · 0 评论 -
算法整理 & 复习:匈牙利算法
匈牙利算法用于二分图最大匹配文章目录匈牙利算法匈牙利算法P6268 [SHOI2002]舞会#include <stdio.h>#include <string.h>#include <iostream>using namespace std;#define MAXN 2005int n,m,ans;int vis[MAXN];int col[MAXN];int match[MAXN];int map[MAXN][MAXN];v原创 2021-01-28 11:43:10 · 538 阅读 · 0 评论 -
算法整理 & 复习:Splay
旋转规则:一:Zig此时节点 u 是 rootv 是左孩子:右旋v 是右孩子:左旋二:Zig_Zig ( v , u 同侧,先 u 再 v)此时节点 u 不是 rootv 与 u 同为左孩子: 右旋两次v 与 u 同为右孩子: 左旋两次三:Zig_Zag ( v ,u 异侧,先 v 再 u)此时节点 u 不是 rootv 是左孩子,u 是右孩子:v 先右旋,再左旋v 是右孩子,u 是左孩子:v 先左旋,再右旋...原创 2021-01-27 19:21:54 · 180 阅读 · 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 · 131 阅读 · 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 · 137 阅读 · 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->wstruct node{ int L,R;原创 2020-12-15 18:55:36 · 166 阅读 · 0 评论 -
算法整理 & 复习:树上倍增
树上倍增P3379 【模板】最近公共祖先(LCA)#include <math.h>#include <stdio.h>#include <iostream>using namespace std;#define MAXN 500005int 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 · 138 阅读 · 0 评论 -
算法整理 & 复习:割点、割边
文章目录一、割点(割顶)二、割边(桥)一、割点(割顶)P3388 【模板】割点(割顶)#include <stdio.h>#include <iostream>using namespace std;#define MAXN 200005int 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 · 335 阅读 · 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 · 1123 阅读 · 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 · 117 阅读 · 0 评论 -
算法整理 & 复习:最小生成树
文章目录一、Kruskal二、Prim一、KruskalP3366 【模板】最小生成树#include <stdio.h>#include <algorithm>#include <iostream>using namespace std;#define MAXN 200005int 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 · 154 阅读 · 0 评论 -
算法整理 & 复习:最短路、次短路
文章目录一、SPFA二、dfs 版 SPFA一、SPFAP3371 【模板】单源最短路径(弱化版)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 · 213 阅读 · 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 · 864 阅读 · 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 · 371 阅读 · 0 评论 -
算法整理 & 复习:并查集、带权并查集
文章目录一、并查集二、带权并查集三、并查集的优化1. 路径压缩2. 按秩合并一、并查集P3367 【模板】并查集//骞舵煡闆?#include <stdio.h>#include <iostream>using namespace std;#define MAXN 10005int 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 · 264 阅读 · 0 评论 -
算法整理 & 复习:堆
文章目录一、大顶堆二、小顶堆一、大顶堆二、小顶堆P3378 【模板】堆#include <stdio.h>#include <iostream>using namespace std;#define MAXN 1000005int 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 · 135 阅读 · 0 评论 -
算法整理 & 复习:栈、单调栈
文章目录一、栈二、单调栈一、栈P1165 日志分析#include <stdio.h>#include <iostream>using namespace std;#define MAXN 200005struct 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 · 144 阅读 · 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 · 270 阅读 · 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 · 686 阅读 · 0 评论 -
算法整理&复习:树状数组
文章目录二叉树的遍历树状数组线段树树链剖分倍增字典树平衡树珂朵莉树二叉树的遍历树状数组线段树树链剖分倍增字典树平衡树珂朵莉树原创 2020-10-29 13:08:32 · 212 阅读 · 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 · 173 阅读 · 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 · 198 阅读 · 0 评论