Data Structures and Algorithms
算法和数据结构
会做饭的好同学
遇多少风浪,心不再摇晃
展开
-
图论Graph Theory(5):拓扑排序
Topological Sort:1. 什么是拓扑排序2. 拓扑排序与 DFS 遍历的区别3. 拓扑排序的实现1. 什么是拓扑排序拓扑排序是对有向无环图 DAG 中的所有节点的一种线性次序,满足如下条件:对于每一条有向边 uv,拓扑排序中,节点 u 总会出现在节点 v 之前,拓扑排序只能用于 DAG例如${5,4,2,3,1,0}$就是一种拓扑排序,当然拓扑排序也不是唯一,${4,5,2,3,1,0}$也是一种拓扑排序。2. 拓扑排序与 DFS 遍历的区别与拓扑排序不同,DFS 的结果为${5,原创 2020-11-28 20:55:42 · 201 阅读 · 0 评论 -
线段树Segment tree(1):单点修改,区间查询
问题描述: 给定数列a[1],a[2],…,a[N],依次进行Q次操作,操作有两类:1 i x: 给定i,x,将a[i]加上x2 l r: 给定i,x,求∑i=lr\sum_{i=l}^r∑i=lra[i]代码// TSWorld#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;const int N原创 2020-10-16 17:37:29 · 3223 阅读 · 0 评论 -
二维树状数组Binary Indexed Tree(3):区间修改,区间查询
Description:给出一个 n ×\times× m的零矩阵 A,完成如下操作:1 a b c d x : 表示左上角为(a,b),右下角为(c,d)的子矩阵内所有数自增k2 a b c d : 表示询问左上角为(a,b),右下角为(c,d)的子矩阵内所有数之和代码:// TSWorld#include <bits/stdc++.h>using namespace std;#define rep(i,l,r) for(int i = l; i <= r;i++)#原创 2020-11-06 11:13:19 · 242 阅读 · 0 评论 -
二维树状数组Binary Indexed Tree(2):区间修改,单点查询
Description:给出一个 n ×\times× m的零矩阵 A,完成如下操作:1 a b c d k : 表示左上角为(a,b),右下角为(c,d)的子矩阵内所有数自增k2 x y : 表示询问Ax,y的值代码:// TSWorld#include <bits/stdc++.h>using namespace std;#define rep(i,l,r) for(int i = l; i <= r;i++)#define ll long longconst i原创 2020-11-06 09:36:59 · 206 阅读 · 0 评论 -
二维树状数组Binary Indexed Tree(1):单点修改,区间查询
Description:给出一个 n ×\times× m的零矩阵 A,完成如下操作:1 x y k : 表示元素Ax,y自增 k2 a b c d : 表示询问左上角为(a,b),右下角为(c,d)的子矩阵内所有数的和。代码:// TSWorld#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>原创 2020-11-03 16:00:47 · 207 阅读 · 0 评论 -
树状数组Binary Indexed Tree(3):区间修改,区间查询
Description给定数列a[1],a[2]…,a[n],需要依次执行q个操作。操作分两类:1 l r x : 给定l,r,x,对于所有 i ∈\in∈ [l,r],将a[i]加上x2 l r :给定l,r,求∑i=lr\sum_{i=l}^r∑i=lra[i]的值(1 ≤\leq≤ n,q ≤\leq≤ 106)解题思路算法标签:树状数组利用差分的思想。设原数组number[i],d[i] = number[i] - number[i-1]∑i=1pnumber[i]\sum_原创 2020-11-03 11:24:25 · 150 阅读 · 0 评论 -
树状数组Binary Indexed Tree(2):区间修改,单点查询
Description给定数列a[1],a[2]…,a[n],需要依次执行q个操作。操作分两类:1 l r x : 给定l,r,x,对于所有 i ∈\in∈ [l,r],将a[i]加上x2 i :求a[i]的值(1 ≤\leq≤ n,q ≤\leq≤ 106)解题思路算法标签:树状数组利用差分的思想。设原数组number[i],d[i] = number[i] - number[i-1],所以number[i] = ∑j=1id[i]\sum_{j=1}^id[i]∑j=1id[i],即原创 2020-11-03 10:31:12 · 115 阅读 · 0 评论 -
树状数组Binary Indexed Tree(1):单点修改,区间查询
Description给定数列a[1],a[2]…,a[n],需要依次执行q个操作。操作分两类:1 i x : 将a[i]加上x2 l r :给定l,r,求∑i=lr\sum_{i=l}^r∑i=lra[i]的值(1 ≤\leq≤ n,q ≤\leq≤ 106)代码// TSWorld#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#inc原创 2020-11-03 09:40:33 · 76 阅读 · 0 评论 -
动态规划(6):完全背包问题
完全背包一、问题描述:二、解决方案:三、代码:四、完全背包算法优化:4.1 思路分析:4.2 代码:五、0/1背包算法的优化:5.1 思路分析:5.2 代码:一、问题描述:给定一组物品,给出每种物品的价值和重量,每种物品足够多,在限定重量内,如何选择,才能使物品总价值最高二、解决方案:设f(x)表示重量不超过x千克的最大价值,则:设f(x)表示重量不超过x千克的最大价值,则:设f(x)表示重量不超过x千克的最大价值,则:f(x)=max{f(x−weight[i])+value[i]}f(x) =原创 2020-11-09 16:31:46 · 107 阅读 · 0 评论 -
动态规划(5):货币问题
一、问题描述:有 V 种面值的货币,求组成面值 N 的货币有多少种方案。二、解决方案:该问题实际是一个最大化的问题,用自底向上的方式求最有解。如果问题规模较大,考虑高精度计算。假设有3种货币,面值分别为1,2,5,组成面值为10的货币。把第 1 种货币组成面值为 j 的方案数作为第一阶段,把前 2 种货币组成面值为 j 的方案数作为第二阶段,⋯⋯\cdots \cdots⋯⋯,把前 V 种货币组成面值为 j 的方案数作为第V阶段。第一阶段初始值均为1。动态转移方程:f[i][j]=f[i−1原创 2020-11-09 11:59:45 · 1520 阅读 · 1 评论 -
动态规划(4):0/1背包问题
一、问题描述:给定一组物品,给出每种物品的价值和重量,每种物品只有一件,在限定重量内,如何选择,才能使物品总价值最高二、解决方案:穷举法可能会超时,贪心法不一定得到最优解。设 F(i,x)F(i,x)F(i,x) 表示前 i 件物品,背包容量为 x 时的最优价值。则F(i,x)=max{F(i−1,x−W[i])+C[i],F(i−1,x)}F(i,x) = max\{F(i-1,x-W[i])+C[i],F(i-1,x)\}F(i,x)=max{F(i−1,x−W[i])+C[i],F(i−1,原创 2020-11-09 11:12:59 · 93 阅读 · 0 评论 -
动态规划(3):简单背包问题
简单背包问题一、问题描述二、解决方案(1):枚举三、解决方案(2):递归一、问题描述有一个背包,可以放入的重量为S,现在有N块金矿,重量分别为W1,W2,…,Wn,各重量均为正整数,从n件挑选若干件,使得放入背包的重量之和正好为S,若成功,则输出放入背包的物品,否则输出“Failed!”二、解决方案(1):枚举显然枚举所有中可能性,利用二进制的原理,1代表该物品被拿,0代表没有拿//freopen("hao.txt","r",stdin);#include <iostream>#i原创 2020-07-25 22:45:37 · 404 阅读 · 0 评论 -
动态规划(2):最长不下降子序列优化版本
最长不下降子序列问题:在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。时间复杂度:O(nlog2n)因为采用二分查找在有序序列num中查找,所以为O(nlog2n)注意:num中不是最长不下降子序列,而max_length则是最长不下降子序列的长度//freopen("hao.txt","r",stdin);#include <iostream>#include <cstdlib>#include <cst原创 2020-07-11 22:57:30 · 265 阅读 · 0 评论 -
动态规划(1):最长不下降子序列
最长不下降子序列问题:在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。时间复杂度: O(n2)//freopen("hao.txt","r",stdin);#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;const int N = 10005;in原创 2020-07-11 22:51:29 · 203 阅读 · 0 评论 -
图论Graph Theory(4):最小生成树
最小生成树一、最小生成树概念二、Prim's算法三、Kruskal算法一、最小生成树概念最小生成树是一副连通加权无向图中一棵权值最小的生成树。二、Prim’s算法#include <iostream>#include <cstdlib>#include <cstdio>using namespace std;const int V = 5;const int MAXX = 1314520;void printMST(int parent[],int原创 2020-07-18 15:04:23 · 131 阅读 · 0 评论 -
图论Graph Theory(3):并查集
并查集一、并查集概念二、并查集的两种操作2.1 find()判断两个元素是否属于同一个集合2.2 union()合并两个不相交的元素三、并查集的优化3.1 路径压缩3.2 按秩优化四、并查集判环五、完整代码一、并查集概念并查集: 并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。二、并查集的两种操作2.1 find()判断两个元素是否属于同一个集合int find(int parent[], int i) { //parent存储i节点的父节点,p原创 2020-07-12 12:07:26 · 131 阅读 · 0 评论 -
图论Graph Theory(2):最短路径
一、单源最短路径问题从一个顶点到其他所有顶点间的最短路径二、多源多目标的最短路径问题原创 2020-07-11 16:54:06 · 244 阅读 · 0 评论 -
图论Graph Theory(1):图的表示法及遍历
图的表示法1.邻接表2.邻接矩阵原创 2020-06-20 23:01:20 · 1250 阅读 · 2 评论 -
二叉搜索树插入简单模板
DescriptionBinary search tree: Used for searching. A binary tree where the left child contains only nodes with values less than the parent node, and where the right child only contains nodes with val...原创 2019-10-31 09:09:10 · 94 阅读 · 0 评论 -
MergeSort简单版本
描述:从小到大排列,并计算比较次数#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;const int N = 10001;const int MAXX= 100056;int data[N];int times;void merage(int left...原创 2019-07-17 16:52:25 · 88 阅读 · 0 评论 -
数组模拟栈求逆波兰表达式&&字符串string转int
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<vector>#include<queue>using names...原创 2019-04-13 17:46:36 · 112 阅读 · 0 评论 -
QuickSort(未完成)
#include<iostream>#include<queue>#include<cstdio>#include<cstdlib>#include<vector>using namespace std;int data[100005];int n;int paritition(int r,int p){ int i=...原创 2018-12-02 09:56:50 · 134 阅读 · 0 评论 -
heapsort(堆排序)
#include&amp;lt;cstdlib&amp;gt;#include&amp;lt;cstdio&amp;gt;#include&amp;lt;cstring&amp;gt;#include&amp;lt;vector&amp;gt;using namespace std;int heapsize;int father(int i){ re原创 2018-11-27 21:12:36 · 193 阅读 · 0 评论 -
N皇后问题(简要版)
八皇后问题是经典题目,无需赘述样例输入16样例输出1* Q * * * * * * * Q * * * * * * * Q Q * * * * * * * Q * * * * * * * Q * * * Q * * * * * * * * Q * Q * * * * * * * * Q * Q * * * * * * * * Q * * * * * Q * * Q * * * * * * * * * Q * * Q * * * * * * * * * Q *原创 2020-05-30 17:20:18 · 168 阅读 · 0 评论