ACM算法
文章平均质量分 56
孤舟独钓寒江雪
这个作者很懒,什么都没留下…
展开
-
leetcode 题型汇总
leetcode原创 2022-09-06 18:13:48 · 97 阅读 · 0 评论 -
NC15696 Professional Manager(并查集)
NC15696 Professional Manager#include<bits/stdc++.h>using namespace std;const int maxx=200010;int par[maxx];int num[maxx];int id[maxx];int find(int x){ if(x==par[x])return x; return par[x]=find(par[x]);}int main(){ int t; cin>&原创 2021-02-03 02:25:04 · 154 阅读 · 0 评论 -
632. 矩阵转换后的秩(并查集)
1632. 矩阵转换后的秩class Solution {private: int n, m; int fatherIdx[500 * 500 + 5], fatherVal[500 * 500 + 5] = { 0 };public: int findSet(int x) { if (x != fatherIdx[x]) fatherIdx[x] = findSet(fatherIdx[x]); return fatherIdx[x];原创 2021-02-02 12:38:04 · 178 阅读 · 0 评论 -
P1525 关押罪犯(并查集)
P1525 关押罪犯#include<cstdio>#include<iostream>//#include<bits/stdc++.h>#include<cstring>#include<algorithm>using namespace std;int n,m,p,par[300001],b[30001];//初始化n个元素struct ele{ int a,b,p;}ele[300001];bool cmp(s原创 2021-02-02 11:55:33 · 89 阅读 · 0 评论 -
蓝桥杯 国王的烦恼(并查集)
蓝桥杯 国王的烦恼#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 1e5+5;int n, m, pre[maxn];struct node{ int u, v, d; bool operator <(const node &a) const原创 2021-02-02 12:15:45 · 91 阅读 · 0 评论 -
POJ1182 食物链(并查集)
POJ1182食物链#include<cstdio>#include<iostream>using namespace std;const int MAX_K = 150010;const int MAX_N = 1e5+20;int N,K;int T[MAX_K],X[MAX_K],Y[MAX_K];int par[3*MAX_N],_rank[3*MAX_N];//T为信息类型//初始化n个元素void init(int n){ for(int i=原创 2021-02-02 11:26:07 · 63 阅读 · 0 评论 -
PAT 1107 Social Clusters(并查集)
PAT 1107 Social Clusters//并查集#include <cstdio>#include <vector>#include <algorithm>using namespace std;vector<int> father, isRoot;int cmp1(int a, int b){ return a > b;}int findFather(int x) { int a = x; while原创 2021-02-03 02:25:31 · 171 阅读 · 0 评论 -
PID331 / 家族(并查集)
PID331 / 家族#include<cstdio>#include<iostream>using namespace std;int n,m,p,par[30001];//初始化n个元素void init(int n){ for(int i=0;i<n;i++){ par[i]=i; }}int find(int x){ if(par[x]==x){ return x; }else{原创 2021-02-02 11:51:21 · 70 阅读 · 0 评论 -
HDU1232 畅通工程(并查集)
HDU1232 畅通工程#include<cstdio>#include<iostream>using namespace std;const int MAX_K = 150010;const int MAX_N = 1e5+20;int n,m,par[1001];//初始化n个元素void init(int n){ for(int i=1;i<=n;i++){ par[i]=i; }}int find(int x){原创 2021-02-02 11:39:23 · 64 阅读 · 0 评论 -
哈夫曼树,哈夫曼编码
简介结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记作:WPL=∑i=1nwiliWPL=\sum_{i=1}^{n}w_{i}l_{i}WPL=i=1∑nwili其中,n表示叶子结点的数目,wi和li分别表示叶子结点ki的权值和树根结点到叶子结点ki之间的路径长度。在权为w1,w2,……wn的n个叶子结点的所有二叉树中,带权路径长度为WPL最小的二叉树,称为哈夫曼二叉树或最优二叉树。原创 2021-02-06 11:39:07 · 102 阅读 · 0 评论 -
AC自动机
简介 KMP 算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法。 Trie 树是一种哈希树的变种。 AC自动机算法分为3步:①构造一棵Trie树; ②构造失败指针; ③模式匹配过程。结构体typedef struct A { int cent;//记录是否为尾节点 A *next[26];//子节点指针 A *fail;//失败指针 A(){//初始化 cent = 0, ms(next), fail = NULL; }}node;1.原创 2021-02-02 01:19:00 · 68 阅读 · 0 评论 -
并查集
并查集:是一种用来管理元素分组情况的数据结构,并查集可以高效地进行如下操作: 1)查询元素a和元素b是否属于同一组。 2)合并元素a和元素b所在的组。并查集的功能并查集的结构图例说明初始化:我们准备n个结点来表示n个元素。最开始时没有边。合并:从一组的根向另一组根的连边,这样两棵树就变成了一棵树,也就把两个组合并为一个组了。合并:进一步合并。查询:为了查询两个节点是否属于同一组,我们需要沿着树向上走,来查询包含这个元素.原创 2021-02-02 10:49:32 · 60 阅读 · 0 评论 -
KMP算法
KMP算法相对于Brute-Force算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。提取加速匹配信息 KMP算法主要是通过消除主串指针的回溯来提高匹配的效率的,实际上是提取并运用了加速匹配的信息! 对于模式串 t 的每个元素 t j,都存在一个实数 k ,使得模式串 t 开头的 k 个字符(t0, t1,…,tk-1)依次与 tj 前面的 k 个字符(tj-k,tj-k+1,…,tj-1 这里第一个字符 tj-k 最多从 t1 开始,所以 k &l.原创 2021-02-01 10:34:59 · 167 阅读 · 1 评论 -
BFS算法
bfs算法 广度优先搜索算法(BFS),当碰到岔道口时,总是先依次访问从该岔道口能直接到达的所有结点,然后再按这些结点被访问的顺序去依次访问它们能直接到达的所有结点,直到所有结点都被访问为止,类似于树的层次遍历。 单源最短路径算法(Dijkstra)和最小生成树算法(Prim)都采用了和宽度优先搜索类似的思想,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。需要用到队列数据结构。 (1)先访问完当前顶原创 2021-02-01 01:20:06 · 151 阅读 · 0 评论 -
最小生成树2:Kruskal算法
Kruskal算法 Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。算法描述 1).记Graph中有v个顶点,e个边; 2).新建图Graphnew,Graphnew中拥有原图中相同的e个顶点,但没有边; 3).将原图Graph中所有e个边按权值从小到大排序; 4).原创 2021-01-31 22:17:01 · 267 阅读 · 0 评论 -
最短路径4:SPFA算法
SPFA算法1.时间复杂度比普通的Dijkstra和Ford低。2.能够计算负权图问题。3.能够判断是否有负环 (即:每跑一圈,路径会减小,所以会一直循环跑下去)。动态逼近法:1.设立一个先进先出的队列用来保存待优化的结点。2.优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。3.这样不断从队列中取出结点来进行松弛操作,直至队列空为止期望的时间复杂度O(ke), 其中原创 2021-01-31 22:13:20 · 178 阅读 · 0 评论 -
最短路径2:Floyd算法
Floyd算法基本思想: 对于弧<vi,vj>,进行n次试探:首先考虑路径<vi,v0,vj>是否存在,如果存在,则比较<vi,vj>和<vi,v0,vj>的路径长度,取较短者为从vi到vj的中间顶点的序号不大于0的最短路径。在路径上再增加一个顶点v1,依此类推,在经过n次比较后,最后求得的必是从顶点vi到顶点vj的最短路径。 通常可以在任何图中使用,包括有向图、带负权边的图。时间复杂度为O(n3)数据结构:带权的邻接矩阵存储结构 pa原创 2021-01-31 22:11:37 · 79 阅读 · 0 评论 -
最短路径1:Dijkstra算法
最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径。 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径。AE:1 ADE:2 ADCE:3 ABCE:3AE:100 ADE:90 ADCE:60 ABCE:70 单源点最短路径问题:给定带权有向图G=(V, E)和源点v∈V,求从v到G中其余各顶点的最短路径。 每一对顶点之间的最短路径:给定带权有向图G=(V, E),对任意顶点vi,vj∈V(i≠j).原创 2021-01-31 02:27:08 · 175 阅读 · 1 评论 -
最小生成树1:Prim算法
Prime算法 普里姆算法(Prim),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。 算法简单描述: 1).输入:一个加权连通图。其中,顶点集合为V,边集合为E; 2).初始化:Vnew = {x} 其中,x为集合V中的任一节点(起始点)。Enew = {} 为空; 3).重复下列操作,直到 Vnew = V: a.在集合E中选取权值最小的边<u, v>。其中原创 2021-01-31 02:37:34 · 212 阅读 · 0 评论 -
DFS算法
void dfs(int now, int pre, int d[], vector<int> tree[])//Depth first search{ int u;//u traverse all points in tree[now][] for(int i = 0; i < (int)tree[now].size(); ++i){ if ((u = tree[now][i]) != pre) { d[u] = d[now] +原创 2021-01-29 11:37:28 · 212 阅读 · 0 评论