图论算法
0x01 Dijkstra算法(寻找有权图最短路径)看视频的讲解实现的,P4(视频地址)
这里默认源点是1,之后再改改自定义源点的,
这个算法的大致思路是,从一个源点开始,把他压入优先队列(小的先出),然后给存储最短路径的dis数组全部初始化无穷大,接着就可以开始循环了。只要队列不为空,我们就一直取队列里的元素,然后判断由这个节点到下个节点的路径是不是最小的,如果是就把下个节点压入队列,若不是就不压入。每个节点到源点的最短路径是递归而来的。
算法就是一直在完善这个表。由于有优先队列存在,省去了无意义的路线判断,很大程度上一次就可以寻得最短路径,因为是从小权重的边开始寻路的。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include<iostream>#include<math.h>#include<algorithm>#include< ...
STL队列和栈
0x01 栈1#include<stack>
先记录一下栈stack。
和数据结构教材讲的性质基本一致,这里记录一下STL实现栈的方法。
1stack<typename T, typename Container = deque<T>>
栈的类模板,第一个参数是存储对象的类型,第二个参数是底层容器的类型。
还有一个swap函数,swap(stack &other_stack),能将当前栈中的元素和参数中的元素交换。stack模板还有赋值运算符重载,operator=( )。
访问栈:
123456789101112deque<int> data{0,1,2,3,4}; //初始化一个栈stack<int> data(data); cout<<"data : "<<data.size()<<endl; while(!data.empty()){ //获得栈顶元素 cout<<data.top()<< ...
vector容器基础
0x01 vector构造函数
除了第一种,其他几种基本都是拷贝构造而来的。
12vector<int>v(10,100);//压入10个100的int数
拷贝构造函数
12vector<int>v2(v);//拷贝了v的10个100
0x02 vector赋值操作
第一种就是等号运算符重载,直接v1 = v2赋值就好了。
0x03 vector容量和大小
empty( ),若容量为空则返回true,不为空则返回false。
capacity( )是返回容器的容量的函数,容器的容量不小于容器中元素的个数(常识)。
resize函数能调整容器的大小(长度size,并非容量)。
resize函数若不指定填充的元素elem,则默认填充0。
0x04 vector插入和删除
这里重点记录一下迭代器修改元素的方法。
123//迭代器插入法v1.insert(v1.begin(),100);//在v1.begin()的位置插入100,v1.begin()是指向首元的迭代器
注意const_iterator pos 位置是传入迭代器就好了。
0x05 vector数据存取
没 ...
线段树转载记录
原文章(线段树)
0x01 种一颗线段树假如我现在有一个数组A,总共有n个元素,我既想实现区间修改,又想单个修改,这时候种一颗线段树来维护这个数组,能平衡收益。
0x02 怎么建立?线段树是一颗平衡二叉树,双亲结点是区间的和,左右子节点是双亲区间分两半的区间
每个节点 p 的左右子节点的编号分别为 2p 和 2p+1,假设 双亲结点p 的为区间 [l , r]的和。
设 mid = [(l + r)/2],那么两个子节点分别存储[l , mid] 和 [mid+1 , r]的和。可以发现,左节点对应的区间长度,与右节点相同或者比之恰好多1。
知道这些后,便可以用递归的方法来种一颗线段树了。大体的思想就是,从叶子结点开始,从下往上逐步建立。这便是递归的思想
12345678910111213141516void build(elem l = 1, elem r = n, elem p = 1){ // 到达叶子节点 if (l == r){ // 到达叶子节点 tree[p] = A[l]; // 用数组中的数据赋值 ...
记录一下刷的入门题
0x01 P1009 [NOIP1998 普及组] 阶乘之和这题要用高精度乘法和高精度加法,把每位数字单独存储到一个数组中,每个元素如果大于9再进位,以此类推。这题的乘法是半个高精度,一个是高精度数字,另一个是普通的int数,简单了一点。
不过如果两个都是高精度数的乘法,原理差不多,就是把这个一个高精度一个普通的做好多遍,然后全部加起来再进位就好了,以后有机会再写。
12345678910111213141516171819202122232425262728293031323334353637383940#include<iostream>#include<math.h>#include<algorithm>using namespace std;int i,sum[1005]={0},one[1005]={0},n,j;int main(){ cin >> n; sum[0]=one[0]=1; for (i=2;i<=n;i++){ f ...
C++容器初识和string容器
0x01 vector容器1234567891011121314151617#include<iostream>#include<vector>int main(){ //创建vector容器 std::vector<int> v; //存入数据 for(int i = 0;i < 10;i ++){ v.push_back(i); } //通过迭代器遍历 //it可看成指针,begin()是起始迭代器,存放容器第一个数据的地址 for(std::vector<int>::iterator it = v.begin(); it != v.end();it ++){ std::cout << *it << " "; } return 0;}//运行结果:0 1 2 3 4 5 6 7 8 9
简单的使用方法。。
vector类模板,除了int以外还能定义其他数据类型。
容器是可以嵌套容器的,可以将内层的容器看成一个数据类型,
...