算法学习
基本算法
华zyh
这个作者很懒,什么都没留下…
展开
-
路径压缩并查集
#include<iostream>#include<algorithm>using namespace std;int utf[10000];int Find(int child){ int c = child; while(utf[c] != c) c = utf[c]; while(child !=c ){ int t = utf[child]; utf[child] = c; child = t; } return c;}void u原创 2020-10-15 00:10:10 · 68 阅读 · 0 评论 -
Dijkstra+DFS模板(PAT1030 Travel Plan (30分))
#include<iostream>#include<vector>#include<algorithm>using namespace std;const int INF = 10000000;int dis[501][501];int cost[501][501];int dest[501];bool visited[501] = {false};vector<int> paths[501];int N,M,S,T; void原创 2020-07-03 23:19:37 · 142 阅读 · 0 评论 -
dijskra最短路径模板(结合优先队列)
struct node{ int from,to; int time; node(int a, int b, int c): from(a),to(b),time(c){ }};int N,M,SP,CMAX;vector<node> edge[501];int dist[501] = {0},bike[501];int path[501];bool visited[501] = {false};struct comp{bool operator() (const pai原创 2020-07-01 15:12:35 · 293 阅读 · 0 评论 -
整数划分问题和集合划分问题的区别
整数划分#include <iostream>using namespace std;int f(int n,int m){ if(n==0 || m==1) return 1; if(n<m) return f(n,n); else return f(n,m-1) + f(n-m,m);}int main(){ ios::sync_with_stdio(0); int num;原创 2020-06-30 22:15:18 · 364 阅读 · 0 评论 -
kruskal算法基于并查集的实现
#include<iostream>#include<algorithm>#include<set>#include<vector>using namespace std;/*并查集*/ struct UF{ UF * parent; UF():parent(NULL){ }};UF* find(UF* c){ if(c->parent == NULL) return c; set<UF*> s; w原创 2020-06-14 13:52:06 · 304 阅读 · 0 评论 -
基于类的并查集
/*===并查集===*/class Node {public: Node *parent; Node() : parent(NULL) {}};Node *find(Node *x) { Node *p = x; if (p->parent == NULL)return p; set<Node *> path; while (p->parent != NULL) { path.insert(p);转载 2020-06-13 21:17:06 · 99 阅读 · 0 评论 -
差分数组总结
前缀和: 可以在常数时间内求出区段和,常用于为了提高算法效率做预处理,但是修改元素平均时间复杂度为线性的。差分数组: 可以在常数时间内修改一段一段区间的和,但是查询一段区间和的时间复杂度是线性的,要先做前缀和处理,在与原数组相加,得出若干变化后的数组。...原创 2020-05-04 16:08:46 · 279 阅读 · 0 评论 -
线段树以及树状数组模板( 智乃与无意义的题目 西北工业大学程序挑战赛)
线段树与树状数组是什么?线段树与树状数组都是用来解决数组的更新和区间查询问题,比如说一段数组a[n], 现在要求下标 [i,j] 区间的和,如果按照传统的遍历,则时间复杂度就是线性的,如果我们组织成树状结构,那么复杂度就可以降为log级别。相比较而言,线段树更好理解但代码量较大,树状数组代码量小但不好理解。 我总结了这两个模板,如果需要的话,直接使用这两个模板就可以,线段树我封装成了一个模...原创 2020-05-04 15:42:08 · 165 阅读 · 0 评论 -
树状数组精巧使用模板(快速更新,快速查找)
int n;int a[1005],c[1005]; //对应原数组和树状数组int lowbit(int x){ return x&(-x);}void updata(int i,int k){ //在i位置加上k while(i <= n){ c[i] += k; i += lowbit(i); }}...原创 2020-05-03 21:57:46 · 120 阅读 · 0 评论 -
快速幂通解以及矩阵快速幂通解
求一个数的n次方,如果是累计遍历,那么就是线性级别的复杂度,在这个过程实际上我们做了很多重复运算,比如求3^6 我们完全可以先求出来3^3 ,然后再对 3^3 平方得出解,这样我们就可以通过二分分治的方法将复杂度降到 log n。对于一个矩阵的n次幂同样如此,通过分治的方法,减少运算量。如果采用二分分治的方法,那么这是一个递归的方法,我们考虑能不能转化为非递归做法,这里用到了一些技巧,如下:...原创 2020-04-27 18:14:29 · 236 阅读 · 0 评论 -
2018蓝桥杯倍数问题C++快速解法
标题:倍数问题【题目描述】众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。【输入格式】从标准输入读入数据。第一行包括 2 个正整数 n, K。第二行 n 个正整数,代表给定的 n 个...原创 2020-04-27 13:49:29 · 1490 阅读 · 4 评论 -
蓝桥杯方格分割新解
标题:方格分割6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图:p1.png, p2.png, p3.png 就是可行的分割法。试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。请提交该整数,不要填写任何多余的内容或说明文字。#include<iostream>using namespace st...原创 2020-03-26 21:10:04 · 384 阅读 · 0 评论 -
求真值表,主析取范式,主合取范式
#include<stdio.h>#include<string>#include<iostream>#define num 3#define Fvalue A[0]*!A[1]+A[2]*!A[0]+!A[2]*A[0]+!A[1]*A[0]using namespace std;string hequ;string xiqu;string a...原创 2019-10-29 18:53:15 · 2502 阅读 · 0 评论