模板
zi_wan
这个作者很懒,什么都没留下…
展开
-
小根堆的插入和排序
#include<cstdio>#include<iostream>using namespace std;int hp[105],n,siz;void push(int x)//输(插)入 { if(hp[x]>=hp[x/2]) return; else { int a=hp[x]; hp[x]=hp[x/2]; hp[x/2]=...原创 2017-12-09 11:33:47 · 1113 阅读 · 0 评论 -
最小生成树-Kruskal算法
定理:任何一棵最小生成树一定包含无向图中权值最小的边(反证法)算法思路Kruskal算法基于上述定理,总是维护无向图的最小生成森林。最初,可认为生成森林由0条边构成,每个节点各自为树。在任意时刻,从剩余边中选出一条权值最小的,并且两个端点不连通(属于两棵不同的树),把该边加入生成森林。节点的连通情况用并查集维护。算法流程1.建立并查集,每个点各自为一个集合2.把所有边按权值升序排列,依次扫描每条边...原创 2018-07-06 19:26:13 · 166 阅读 · 0 评论 -
贪心
贪心是一种在每次决策时采取当前意义下最优策略的算法,因此要求整体最优性可以由局部最优性导出。正确性证明的常见手段: 1.微扰(邻项互换) 证明在任意局面下,任何对局部最优策略的改变都会使结果变差 2.范围缩放 ...原创 2018-07-11 16:18:00 · 218 阅读 · 0 评论 -
Floyed算法-求任意两点间最短路
本质是动态规划,O(n^3)算法思路设D[k,i,j]表示“经过若干个编号不超过k的节点”从i到j的最短路该问题可划分为两个子问题:1.经过编号不超过k-1的节点从i到j 2.从i先到k再到jD[k,i,j]=min(D[k-1,i,j],D[k-1,i,k]+D[k-1,k,j])初值为D[0,i,j]=A[i,j] //开头定义的邻接矩阵k这一维可以被忽略Tipsk是阶段,必须置于最外层循...原创 2018-07-04 15:22:20 · 1149 阅读 · 0 评论 -
分治
整数集合上的二分流程 1.确定左右半段哪个是可行区间,以及mid归属于哪一半段 2.根据分析结果选择两个配套形式之一(只适用于非负数) ①r=mid,l=mid+1,mid=(l+r)/2 ②l=mid,r=mid-1,mid=(l+r+1)/2当二分区间包含负数时,需要使用更加一般的计算方法“原创 2018-07-11 13:01:32 · 253 阅读 · 0 评论 -
Bellman-Ford和SPFA算法
定义 给定一张有向图,若对于某一条边(x,y,z),有dist[y]<=dist[x]+z成立,则称该边满足三角形不等式。若所有边均满足三角形不等式,则dist数组就是所求的最短路。基于迭代思想的Bellman-Ford算法1.扫描所有边(x,y,z),若有dist[y]>dist[x]+z,则更新dist[y]2.重复上述步骤直到没有更新操作发生SPFA算法(队列优化的Bell...原创 2018-07-04 12:06:18 · 303 阅读 · 0 评论 -
堆优化的dijkstra算法
基于贪心思想,只适用于边长为非负数的图算法流程1.初始化的dist[1]=0,其余节点的dist为正无穷2.找出一个未被标记、dist[x]最小的节点x并标记3.扫描x的所有出边(x,y,z),若dist[y]>dist[x]+z,则更新dist[y]4.重复2、3,直到所有节点被标记//by ziwan Catherine//堆优化dijkstra 边长为非负数 //d[n]从起点到n...原创 2018-07-04 11:21:25 · 2461 阅读 · 0 评论 -
最小生成树-Prim算法
Prim算法总是维护最小生成树的一部分。最初,Prim算法近仅确定1号节点属于最小生成树。在任意时刻,设已经确定属于最小生成树的节点集合为T,剩余节点集合为S。...原创 2018-07-09 19:46:00 · 225 阅读 · 0 评论 -
基本深搜模板
一个基本的深搜模板int search(int t){ if(满足输出条件) { 输出解; } else { for(int i=1;i<=尝试方法数;i++) if(满足进一步搜索条件) { 为进一步搜索所需要的状态打上标记; ...原创 2018-06-20 11:25:44 · 1162 阅读 · 0 评论 -
拓展欧几里得算法
概述【背景:欧几里得算法即辗转相除法 求gcd(a,b)】对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。递归式推导递归终点在欧几里得算法求gcd时,递归终点是b=0此时ax=gcd(a,0) 所以x=1,即为递归终点代码实现通解与特解 若(x0,y0)是不定整数方程ax+by=c的一组解...原创 2018-05-30 01:31:09 · 156 阅读 · 0 评论 -
高斯消元法
double a[i][i];const double eps =1e-5;//1*10^-5void gauss(int n){ for(int i=1;i<=n;i++)//枚举方程 { int k=-1; for(int j=1;j<=n&&k==-1;j++) if(fabs(a[i][j])...原创 2018-05-02 22:42:36 · 133 阅读 · 0 评论 -
线段树模板
模板#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#define size using namespace std;struct tree{ int l,r; int mx,sum;}t[size*4];void bu...原创 2018-04-06 09:48:36 · 237 阅读 · 1 评论 -
完全背包
完全背包问题题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i],每件物品可以使用无限次。求解将哪些物品装入背包可使价值总和最大。基本思路这个问题非常类似于01背包,所不同的是每种物品有无限件,也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……取[V/c]件等很多种。如果仍然按照解01背包时的思路,令f[v]表示前i种物品恰放入...原创 2018-03-27 00:34:12 · 97 阅读 · 0 评论 -
01背包问题
今天是决定要好好学oi的第一天,虽然还是因为各种各样的原因耽搁了一会,但任务还是完成啦~01背包问题题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方...原创 2018-03-21 01:40:00 · 250 阅读 · 0 评论 -
邻接表 链式前向星
//链式前向星 #include#includeusing namespace std;int cnt,last[10],a[10],n;struct edge{int to,next;//每个结点存一条边,next表示下一条边,to表示这条边的终点}edge[505];void add(int bg,int ed){cnt++; edge[cnt].t原创 2017-12-09 11:46:29 · 210 阅读 · 0 评论 -
基本数据结构汇总
栈元素先进后出 栈顶进栈顶出一般用数组或链表来实现插入删除时间复杂度O(1) 空间复杂度O(n)单调栈 乱发节 从前向后扫,维护一个自底向上单调递减的单调栈。每扫到一个数,就把栈顶所有小于这个数的元素弹出栈,把这个元素加入栈。进出栈序列问题递归 O(2^n)枚举每一步进栈还是出栈递推 O(n*n)考虑1在出栈序列中的位置,如果1排在第k个,问题就被划分为"k-1...原创 2018-08-16 00:14:12 · 215 阅读 · 0 评论