
每日算法实现
文章平均质量分 50
黎果666
内容仅作学习记录
展开
-
并查集模板
并查集模板主要用于处理一些不相交集合的合并问题,p[i] : i 所在集合的根节点,rank[i] : 以 i 为根节点展开的树的深度。初始化:各元素自成一个集合,p[i] = i, rank[i] = 0。find(x):找到元素 x 所在的集合的根节点。注意在查找过程中进行路径压缩。union(x, y)(合并):把元素 x 和元素 y 所在的集合合并,要求 x 和 y 所在的集合不相交,如果相交则不合并。合并时候按 rank[x] 和 rank[y] 的大小合并。/*==========原创 2021-09-04 15:54:47 · 109 阅读 · 0 评论 -
快速幂模板
快速幂模板(仅作记录)普通n次幂using type_c = int; //类型为int;using ll = long long;#define mod 1000000000type_c my_pow(type_c a, ll n){ if(n == 0) return 1; if(n % 2 == 0) return my_pow(a, n/2) * my_pow(a, n/2) % mod; else return a * my_pow原创 2021-08-29 17:10:17 · 220 阅读 · 0 评论 -
树状数组模板
树状数组在求解区间和的时候,使用前缀和数组,可以通过 sum[r] - sum[l-1]的操作O(1)求取sum[l, r] ,但是如果我们需要修改原数组,那么就得遍历一整个数组修改sum[i],O(n);如果用普通数组,反过来更新的时候O(1),但是求区间和的时间复杂度就变为O(n)了。引入树状数组,可以在O(可以在O(可以在O(log2n\log_{2}{n}log2n )的时间复杂度下更新和求取区间和。个人理解原始数组A[1–N],树状数组C[1–N]。标记为灰色的节点实际已被上层覆盖,原创 2021-08-22 19:05:13 · 75 阅读 · 0 评论 -
dijkstra(堆优化)
dijkstra(堆优化)算法思想(根据一算法模板实现,仅作记录)Dijkstra算法采用的是一种贪心的策略,声明一个数组distt来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T(用vis数组来标记),preV存储路径前驱。初始化,vis[i] = 0, dist[i] = INF,preV[i] = -1。创建一个优先队列q(小顶堆)来存储顶点结点,按dis大小排序。起始点u入队,dist[u] = 0, vis[u] = 1,然后只要队不空且没找到所有结点的最原创 2021-08-17 13:36:23 · 723 阅读 · 0 评论 -
dijkstra(数组实现n²,带打印路径)
dijkstra(数组实现n²,带打印路径)算法思想(参考某算法模板,不知道挂哪的链接,纯属记录)Dijkstra算法采用的是一种贪心的策略,声明一个数组lowcost来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T(用vis数组来标记),path存储路径前驱。初始化,vis[i] = 0, lowcost[i] = INF, cost[i] [j] = INF, cost[i] [i] = 0。初始时,lowcost[beg] = 0,vis[beg] = 1, pat原创 2021-08-15 21:32:07 · 203 阅读 · 0 评论 -
无向图找桥
无向图找桥算法思想:设置vis, pre, anc数组。pre[cur]:cur结点dfs时访问时的时间’。anc[cur]: 记录cur结点及其子孙结点最早祖先的dfs时间(朔源到尽头)。vis标记结点访问状态:0:未访问, 1:正在访问, 2:访问结束。访问当前结点cur时,通过其子孙递归的更新其最早祖先的dfs时间,找出所有桥。dfs过程中,其孩子节点child如果还未开始访问则child为树边,递归;若已经开始访问且未结束,且不是cur父亲,则此节点为cur的祖先,可以更新an原创 2021-08-13 12:36:23 · 311 阅读 · 0 评论 -
无向图连通度(割)
无向图连通度(割)算法思想观察 dfs 搜索树,我们可以发现有两类节点可以成为割点:对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点;对非叶子节点u(非根节点),若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。设置vis, pre, anc数组,cnt记录dfs树中的孩子个数。pre[cur]:cur结点dfs时访问时的时间’。anc[cur]: 记录cur结点及其子孙结点最早祖先的dfs时间(朔源到尽头)。原创 2021-08-13 12:35:50 · 693 阅读 · 0 评论 -
第k短路(A*)
第k短路(A*)A*算法思想广度优先搜索:以广度做为优先级进行搜索。从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点,时间空间开销大。深度优先搜索:每次沿着特定规则走,纵向寻找答案,找到答案的时机视具体情况而不同。对比:假如深度优先在搜索的时候恰好第一次搜索就是正确路径,这个效率就很高,而广度优先是不做决策,同步进行。那么我们有没有办法使得算法在搜索的时候有目的的去搜索呢?答案是肯定的。启发式搜索(A*)给出一个估价函数:g(n) = f(原创 2021-08-13 12:35:17 · 112 阅读 · 0 评论 -
DAG 的深度优先搜索标记
DAG 的深度优先搜索标记邻接矩阵版/*==================================================*\ | DAG 的深度优先搜索标记 | INIT: edge[][]邻接矩阵; pre[], post[], tag全置0; | CALL: dfstag(i, n); pre/post:开始/结束时间\*==================================================*//*注意:发起点——>接受点,中间-原创 2021-08-13 12:34:54 · 348 阅读 · 0 评论