- 博客(67)
- 收藏
- 关注
原创 二分图——染色法、匈牙利算法
二分图的定义二分图就是图中的点可以分成两部分,在每部分内部不存在边,边只存在在两部分之间。二分图的一个重要性质:当且仅当图内部不存在奇数环,则可以为二分图。因此可以根据此性质,用染色法,将每个节点和其相连的点染成不同的颜色,如果在染色过程中发生矛盾,则就不能二分。模板题代码:#include<bits/stdc++.h>using namespace std;const int N = 2e5+10;int h[N],e[N],ne[N],idx;int color[N];i
2021-07-06 14:49:54
188
原创 最小生成树问题——Kruskal算法
算法思路将每条边按权值排序枚举每条边的两个点和权值,如果a,b不连通,将这条边加入集合中。(是初始时不连通,逐步加到集合中并连同,用并查集实现)模板题代码:#include<bits/stdc++.h>using namespace std;const int N = 2e5+10;int p[N];int n,m;struct Edge{ int a,b,c; bool operator<(Edge x){//关键字排序,重载运算符
2021-07-06 11:24:00
160
原创 最小生成树问题——Prim算法
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。Prim算法有朴素版的和堆优化的两种,堆优化的算法一般不常用,可以用Kruskal算法代替。朴素Prim算法的思想设定一个集合,来存储已经确定的点将每个点到集合的距离初识化为无穷大在集合外找到到集合距离最小的点,用这个点更新其他点到集合的距离。迭代n次。模板题代码:#include<bits/stdc++.h>using namespace std;const
2021-07-06 10:41:31
193
原创 多源汇最短路问题——Floyd算法
Floyd算法是基于动态规划的思想,定义一个数组d[N][N],d[x][y]表示x,y之间的最短路问题,经过三重循环最终得到结果。时间复杂度O(n3)O(n^3)O(n3)代码如下#include<bits/stdc++.h>using namespace std;const int N = 210,INF=1e9;int d[N][N];int n,m,k;void floyd(){//三重循环的floyd算法 for(int k=1;k<=n;k++)
2021-07-06 09:13:24
208
2
原创 最短路问题——spfa算法
spfa算法是对bellman-ford算法的优化。bellman-ford算法更新时有些更新是无效的,就造成了时间上的浪费,因此,spfa就用一个队列存储更新了的点,用更新的点更新后边的点。就是说,只有前边一个点变小了,后边的点才可能变小。操作步骤:1节点入队从队头取出一个元素,用该元素更新后边的结点,如果后边的节点是有效更新,就入队,重复这个操作。spfa求最短路#include<bits/stdc++.h>using namespace std;const int N
2021-07-05 23:41:17
182
原创 最短路问题——Bellman-Ford算法
Bellma-Ford算法用来处理有负权边的最短路问题,其操作步骤如下:循环n次遍历所有边a,b,w;松弛操作:dis[b] = min(dis[b],dis[a]+w)由于是直接遍历所有边,所以在图的存储时可直接用结构体存。struct greaph{ int a,b,w;}模板题#include<bits/stdc++.h>using namespace std;const int N =510,M = 1e4+10;int dis[N],backup[N];
2021-07-05 21:42:24
232
原创 最短路问题——Dijkstra
最短路问题有下面两种:单源最短路问题就是从一个点出发,到其他点的最短路。所有边权都是正值的:朴素版的Dijkstra算法(一般用于稠密图),时间复复杂度是O(n2)O(n^2)O(n2);堆优化的Dijkstra算法(用于稀疏图),时间复杂度是O(nm)O(nm)O(nm)。存在负权边:Bellman-Ford算法,时间复杂度是O(nm)O(nm)O(nm);SPFA算法,时间复杂度是O(m)O(m)O(m)多源汇最短路就是多个起点到终点的最短路问题Floyd算法,时间复杂度是O(n3
2021-07-05 15:26:38
270
原创 拓补序列
定义拓补序列是针对有向图而言的:若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。有向无环图一定存在拓补序列,所以有向无环图也称作拓补图。入度与出度入度是指一个点有多少条边指向它出度是指有多少条边从它出发所有入度为零的点都可以排在当前最前面的位置。操作步骤将所有入度为零的点入队从队头取一个元素,遍历所有该元素的边,删除该元素指向下一元素的边如果下一个元素的入度为零,就入队。模板题有向图的拓扑序列
2021-07-05 11:24:18
701
原创 树与图的遍历
树与图的存储树是一种特殊的图,树是连通的有向无环图。图有节点和边组成。图存储一般由两种方法:邻接矩阵,就是用一个二维数组g[a][b]存储a和b之间的一条边。多用于存储稠密图。邻接表。就是开一个链表数组,每个链表存储该节点可以到达的结点。//h[N]为链表数组的头指针数组h[N],e[N*2],ne[N*2],idx;void insert(int a,int b){ e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}树与图的遍历1.深度优
2021-07-05 10:37:26
167
原创 dfs与bfs
深度优先搜索(dfs)深度优先搜索顾名思义就是按照深度一条路走到黑然后再回溯,搜下一条路。这里要理解搜索树的概念,深度优先搜索的一条路都对应搜索树的一个枝儿。要注意,每次回溯时要恢复现场。全排列问题#include<bits/stdc++.h>using namespace std;const int N = 10;int path[N],n;bool st[N];void dfs(int u){ if(u==n){ for(int i=0;i<n;i++)prin
2021-07-04 21:11:15
318
原创 hash表
hash表是将数据映射到下标,常用的有两种方法:拉链法和开放寻址法拉链法拉链法是利用邻接表,将冲突的元素存储在一个链表中,其中h数组就是一个所有链表的头指针数组。具体实现如下:#include<bits/stdc++.h>using namespace std;const int N = 1e5+3;//一般用一个质数,这样冲突的概率小;int h[N],e[N],ne[N];int idx;void Insert(int x){ int k = (x%N+N)%N;
2021-07-04 08:52:54
93
原创 堆与堆排序
堆堆是一个完全二叉树,完全二叉树就是二叉树除了最后一层外均为满的,最后一层从有向左排列。堆分为小根堆和大根堆。小根堆的根节点小于左右两个节点,大根堆相反。堆的相关操作down操作void down(int u){ int t = u; if(u*2<=size&&h[t]>h[u*2])t = u*2; if(u*2+1<=size&&h[t]>h[u*2+1])t = u*2+1; if(t!=u){ swap(h
2021-07-03 16:58:55
113
原创 并查集
并查集可以在近乎O(1)O(1)O(1)的时间复杂度内实现两个有用的操作判断一个元素是否属于同一个集合将两个集合合并基本原理每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个元素都指向它的父节点,p[x]表示x的父节点。判断树根:x==p[x]求x集合的编号:while(p[x]!=x) x = p[x];合并两个集合:p[x] = y;裸并查集#include<bits/stdc++.h>using namespace std;const int N
2021-07-03 15:33:14
66
原创 Trie树(字典树)
Trie树用于快速查找某个字符是否存在在。就是用一棵树存储所有字符,有一个根节点,从根节点出发寻找字符中的字母是否存在。实现快速查找。具体代码实现以模板题为例字符串统计#include<bits/stdc++.h>using namespace std;const int N = 3e5+10;int son[N][26];int cnt[N];int idx,n;void insert(string s){ int p = 0;//0表示根节点 for(
2021-07-03 10:43:20
76
原创 KMP 算法
KMP算法是字符匹配的算法关键是理解前缀表,即next数组。具体过程就不画了,忘了就去b站找找。next数组构造方法void creatne(char *s,int *next){ int n = len(s); int j = -1; next[0] = j; for(int i=1;i<n;i++){ while(j>=0&&s[i]!=s[j+1]) j = next[j]; if(s[i]==s[j+1]) j++; next[i] = j;.
2021-07-01 17:50:26
79
原创 数据结构(一)链表、栈、队列等
单链表如果用结构体表示节点,如下struct LinkNode{ Elem val; LinkNode *next;};用结构体建立单链表时,比较耗费时间采用数组模拟单链表,即静态链表,时间效率较高。e[N],ne[N]分别存储节点的值和下一个节点的下标。head //头指针idx //索引节点的下标初始化操作void Init(){ head = -1;//head指向空 idx = 0;}头插法void insert_head(int x){ e[idx] =
2021-07-01 16:52:12
135
原创 双指针算法、位运算等
双指针算法双指针算法就是利用两个指针将o(n2n^2n2)的算法进行优化。基本模板如下:for(int i=0,j=0;i<n;i++){ while(j<i&&check(i,j))j++; //算法的内容。}例如:最长连续子序列问题for(int i=0,j=0;i<n;i++){ b[a[i]]++; while(b[a[i]]>1){//通过j指针使相同的数变成只有a[i]. b[a[j]]--; j++; }}..
2021-07-01 11:43:59
97
原创 基础算法(二)前缀和、差分
前缀和定义原数组:a1,a2,...ana_1,a_2,...a_na1,a2,...an前缀和数组:S1,S2...SnS_1,S_2...S_nS1,S2...SnSi=a1+a2+a3+...+aiS_i = a_1+a_2+a_3+...+a_iSi=a1+a2+a3+...+ai前缀和数组主要用来求某个区间的和前缀和的原数组和前缀和数组一般从1开始;s[i] = s[i-1] + a[i];sum(l,r) = s[r] - s[l-1];//主要的语句。二
2021-06-30 19:56:08
146
原创 基础算法(一)
快速排序快速排序的基本思想是分治寻找一个分界点,一般是左端点或右端点或中间值或随机一个数。进行调整,调整后的数大于等于轴的在轴的右边,小于等于轴的在左边。递归处理左右两段。具体做法:两个指针,一个从前往后遍历,有个从后往前遍历,前边那个找到第一个比轴大的停下来,右边那个找到第一个比轴小的停下啦,交换,当i>=j时停止。void quick_sort(int *a,int l,int r){ if(l>=j) return; int v = a[l+r>>1];
2021-06-30 16:09:09
90
原创 空气动力学突击(6章5—)
平板边界层层流动量积分方程的解平板湍流边界层动量积分方程的解推导啥的我是在看不懂了,先记公式吧。。。边界层分离现象1、圆柱饶流边界层分离现象在圆柱绕流中,流体受到惯性力、黏性力和压差力的作用。在圆柱面上边界层分离是指边界层内的流体微团受到黏性力作用消耗动能,在压强沿流升高区域,无法继续沿着物面流动,从而发生了倒流,使流体离开物面的现象。对于理想流体,前后对称分布。而对于有黏性的流体,流体不能到达后驻点,提前在物面上速度降为零,改道进入主流区。受逆压梯度的作用,将发生倒流。边界层分离的必要条
2021-06-09 14:31:00
761
1
原创 空气动力学突击(6章1-4)
边界层近似及其特征1、边界层概念小粘性流体在大雷诺数条件下,粘性仅影响靠近扰流物体表面区域的薄流层体内,粘性力无法忽略,这个薄层就是边界层。规定边界层上限为来流速度的0.99倍。在大来流雷诺数下,整体流动区域可分为理想流体的势流区和黏性流体的流动区域,黏里流区。在远物体的理想流体区域,可忽略粘性的影响,按势流处理。在黏性流动区域,仅限于物面附近的薄层内,成为边界层。在该区域内,黏性力无法忽略,与惯性力同量级。Re=V无穷νRe=\frac{V_无穷}{\nu}Re=νV无穷2、边界层的
2021-06-09 13:30:47
1199
原创 空气动力学突击6(5章后续)
N-S方程的精确解教材P161不想看了,来不及看了。粘性流体运动的基本性质因为存在切应力,与理想流体相比,粘性流体在运动过程中主要特点是运动的有旋性、旋涡的扩散性、能量的耗散性。1、粘性流体运动的涡量输运方程粘性流体在运动过程中,涡量随流动总是产生和消亡变化着,几乎都是有旋运动。2、粘性流体运动的有旋性粘性流体旋涡是由存在相对运动的固壁面与流体的粘性相互作用产生的,或着两层不用速度的粘性流体混合时,因粘性的作用产生旋涡。3、粘性流体的扩散性在粘性流体中,旋涡的大小不仅可以随时间产生、
2021-06-03 20:56:00
634
原创 空气动力学突击5(5.1-5.5)
流体的粘性及其对流动的影响1、流体的粘滞性在运动状态下,流体可以承受剪力,流体的粘滞性反映了流体在运动状态下抵抗剪切变形的能力。流体的粘滞性也是流体发生机械能损失的根源。牛内摩擦定律τ=μdudy\tau=\mu\frac{du}{dy}τ=μdydu2、流体粘性运动的特点绕过平板的流动由于存在粘性,紧贴平板表面的流体质点附在平板上,与平板不存在相对运动(不滑移条件),随着离开平板距离的增大,流体速度逐渐增大,最终达到来流速度。这个区域称为边界层。边界层的阻力对应摩擦切应力的积分。绕过圆柱
2021-06-02 17:17:34
1116
原创 空气动力学突击4
理想不可压缩流体平面势流的基本方程组由于欧拉微分方程组不易求解,就讨论了一些特殊情况的解。1、理想不可压缩流体平面势流无旋运动的基本方程组基本方程组包括连续性微分方程和欧拉微分方程组2、速度势函数的性质速度势函数沿着某一方向的偏导数等于该方向的速度分量,速度势函数的增值方向沿着流线方向。速度势函数允许相差任意常数,而不影响流动速度。速度势函数满足拉普拉斯方程,势调和函数。速度势函数的线性组合也满足拉普拉斯方程。速度势函数相等的点连成的线称为等势线,等势线与速度方向垂直。积分与路径无关
2021-05-31 17:16:11
1683
原创 空气动力学突击3
流体运动的积分方程1.控制体与系统系统系统是指包含着确定不变物质的任何集合体。在流体力学中,系统指由任何确定流体质点组成的团体。对应于拉格朗日观点。系统的特点:系统的边界随流体一起运动;在系统边界上没有质量的交换;在系统边界上受到系统外界的表面力;在系统边界上存在能量的交换。控制体控制体是相对坐标系而言,固定不变的任何体积。边界称为控制面。控制体是固定不变的,但被流体所通过,占据控制体的质点在随时间变化。控制体的特点:控制体的边界相对于坐标系而言是固定不变的;在控制面
2021-05-27 21:05:30
1951
原创 空气动力学突击2
1.描述流体运动的方法拉格朗日方法P49这种方法也称为质点系法。通过标示确认所有流体质点,然后记录每个质点在不同时刻的位置坐标,从而达到对整体流动行为的了解。就是观察这跟随流体质点,记录该质点的运动历程。设在初始时刻t0t_0t0时,把流体质点的位置坐标(a,b,c)(a,b,c)(a,b,c)作为该质点的标识符,在任意时刻质点的空间位置坐标可以表示为:x=x(a,b,c,t)x=x(a,b,c,t)x=x(a,b,c,t)y=y(a,b,c,t)y=y(a,b,c,t)y=y(a,b,c,t
2021-05-26 20:47:43
3541
原创 空气动力学突击笔记1
流体的基本属性连续介质假设流体是由无数个质点组成,它们在任何情况下均无空隙地占满所占据的空间。可以用克努森数来判断分子的相对离散程度(一般空气的自由程为10nm)Kn = 分子的平均自由程与研究物体的特征长度的比值。Kn小于0.01,连续流Kn 0.1~1为滑移流1~10为过度流大于10为离散流几个特性易流动性。流体在静止状态下不能受剪切应力。压缩性与弹性。流体在运动过程中,由于温度和压力等因素的改变,引起其体积发生变化的性质称为流体的压缩性,把流体抵抗压缩变形的能力称为弹性。弹
2021-05-25 22:31:26
859
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅