![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
Knock man
在校大三学生一枚,软件工程专业 敢于做逆行者,写好每一篇博客,不断提高自己,欢迎交流
展开
-
数据结构基础代码
本文章为博主考研为巩固知识所写,有不足帮忙指出!!!加油!必上岸!!!目录本文章为博主考研为巩固知识所写,有不足帮忙指出!!!加油!必上岸!!!顺序表单链表无头节点单链表双链表循环双链表顺序栈8.链栈循环队列链式队列顺序表#include<cstdio>#include<stdlib.h>#define MaxSize 100#define test printf("测试\n");//定义顺序表结构 typedef struct node{ int data[Max原创 2021-05-24 21:50:57 · 256 阅读 · 0 评论 -
拓扑排序算法
定义对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。如上图拓扑排序排序序列为{1,2,3,4,5}拓扑序列可能有多个用队列实现拓扑排序最简单代码:#i原创 2020-11-09 16:04:38 · 569 阅读 · 0 评论 -
Bellman-Ford算法(最短路径,解决负权边,检测负环回路)+队列优化
Bellman-Ford算法核心代码只有四行for( k=1;k<=n-1;k++){ for( i=1;i<=m;i++){ if(dis[v[i]>dis[u[i]]+w[i]]){ dis[v[i]]=dis[u[i]+w[i]]; } } } 外循环循环n-1次(n为顶点个数),内循环循环m次(m是边的个数),也即是枚举每一条边,dis数组和Dijkstra算法一样,用来记录源点到其余各顶点的最短路径。u,v,w三个数组用来记录边的信息。原创 2020-10-09 19:09:49 · 1848 阅读 · 2 评论 -
最小生成树(Kruskal算法)
概念一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边模板题Kruskal算法先把边按照权值进行排序,用贪心的思想优先选取权值较小的边,并依次连接,若出现环则跳过此边(用并查集来判断是否存在环)继续搜,直到已经使用的边的数量比总点数少一即可。#include<cstdio>#include<iostream>#include<algorithm>using namespace std;l原创 2020-10-09 17:10:43 · 493 阅读 · 0 评论 -
基本数学问题算法
一.维多项式求值秦九韶算法:A[]//由低次项系数向高次项系数依次排列数组,double类型,n是项数,x自变量double polynomial(double A[],int n,int x){ int i; double result=A[n-1]; for(i=n-2;i>=0;i--){ result=result*x+A[i]; } return result...原创 2020-03-13 13:03:46 · 342 阅读 · 0 评论 -
选k个数的排列与组合用搜索实现
1.在n个数中选k个数,进行排列#include<cstdio>int n,k;int a[100];int t[100];//记录已经选的数bool vis[100];void dfs(int step){ if(step==k){//k个数选完 for(int i=0;i<k;i++){ printf("%d",t[i]); } printf(...原创 2020-04-08 19:18:05 · 335 阅读 · 1 评论 -
数论问题高效算法
1.最大公约数int gcd(int a,int b)//辗转相除法 { if(b==0) return a; int r=a%b; return gcd(b,r);}原创 2020-02-26 18:28:11 · 965 阅读 · 0 评论 -
数据结构-线段树(懒标记)乘除法混合
概念线段树是擅长处理区间的,是一颗完美二叉树(所有的叶子节点的深度都相同,并且每个节点要么是叶子要么有两个儿子的的树),树上每一个节点维护一个区间,根维护整个区间,每个节点维护的是父亲的区间二等分后的一个子区间,当有n个元素时,对区间的操作可以在O(longn )的时间完成结合图理解:注意下图:绿色表示该节点维护的区间,红色表示该节点区间和,黑色表示该节点的编号题:给定 一个数列[3,0,4,10]问题一:查询区间[1,3]中元素的和问题二:将a[2]的值改为99为什么要用线段树来处理?方原创 2020-08-30 22:16:50 · 618 阅读 · 0 评论 -
算法设计竞赛常用技巧-折半枚举
思想问题规模较大时,无法枚举所有元素的组合,但能够枚举一半元素的组合,此时,将问题拆成两半后分别枚举,再合并他们的方法往往非常有效。例如:4 Values Whose Sum is 0(POJ No.2785)题:给出四个数列,要求每个数列中选出一个数,四个数的和为0,问总共有几种选法。当一个数组中有多个相同的数字时,把他们作为不同的数字看待限制条件1<=n<=4000|(数字的值)<=28 |样例输入n=6A={-45,-41,-36,-36,26,-32}B={原创 2020-08-26 14:59:28 · 566 阅读 · 0 评论 -
挑战程序设计竞赛常用技巧-尺取法(方法+模板例题+解答)
尺取法利用双指针解决问题,通常利用指针保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以说尺取法是一种高效的枚举区间的方法,是一种技巧,一般用于求取有一定限制的区间个数或最短的区间等等。当然任何技巧都存在其不足的地方,有些情况下尺取法不可行,无法得出正确答案,所以要先判断是否可以使用尺取法再进行计算。尺取法通常适用于选取区间有一定规律,或者说所选取的区间有一定的变化趋势的情况,通俗地说,在对所选取区间进原创 2020-08-25 12:49:12 · 485 阅读 · 1 评论 -
二分答案算法
想要学习二分答案,就必须先会简单二分简单二分模版://第一个大于或等于x的数的下标 int lower_bound(int x,int n,int a[]){ int lb=-1,ub=n; while(ub-lb>1){ int mid=(ub+lb)/2; if(a[mid]>=x){//如果满足,查找区间缩小到[lb,mid] ub=mid; }else{ lb=mid; } } return ub;}//第一个小于或等于x数的下标 int原创 2020-08-24 17:27:50 · 1283 阅读 · 0 评论 -
并查集算法
用处:判断图中是否有环思想任意遍历图中的一条边的两个顶点1.如果两个顶点所在的树不是相同的根,就将两个顶点所在的集合合并2.如果两个顶点所在的树的根相等,说明存在环,也即这两个顶点在同一集合中集合表示方法:perent[i]=j//表示第i个节点的父节点是j注意:初始化parent[i]=-1;表示此节点无父节点,也即是此节点是根节点压缩路径(减少路径长度):当A集合层数大于B集合时:以A为父节点合并,合并后层数等于原A集合层数当A集合层数小于B集合时:以B为父节点合并,合并后层数等原创 2020-08-23 11:58:21 · 307 阅读 · 0 评论 -
全排列递归套路
求0~9全排列个数#include<cstdio>int a[10]={0,1,2,3,4,5,6,7,8,9,};bool f;int ans=0;bool cheak(){//用来检查题目的条件,具体就题目要求编写 };void permutation(int k){//考虑第k个位置,一般从0开始 int t; if(k==10){//出口 if(c...原创 2020-03-06 10:38:17 · 299 阅读 · 0 评论 -
常用排序算法介绍
一.冒泡排序冒泡排序是一种比较排序,通过两两比较而将一个最大的数推向后面,或者将一个最小的数推向前面,外循环定义的每一次排序,只需要冒一个泡(也就是推一个数),下一次就不需要再访问已经排好的这个地方流程如下:(向前排序)(1)对数组中的各数据,依次比较相邻的两元素的大小(2)如果前面的数据大于后面的数据,就交换这两个数据。经过第一轮的多次比较排序后,便可以把最小的数据排好(3)然后,再...原创 2020-03-07 17:58:45 · 248 阅读 · 0 评论 -
高精度算法(加,减,乘)
1.高精度加法A+B问题思路:1.字符串输入2.反向装入整型数组中3.每位相加(注意进位)4.反向输出#include<iostream>#include<algorithm> #include<cstring>using namespace std;string A;string B;int C[1000001],a[1000001]...原创 2020-03-13 18:19:49 · 360 阅读 · 0 评论 -
阶乘高精度实现(高精度*低精度)
经常会遇见阶乘的处理,而一旦阶乘过大,基本类型就吃不消了,这里介绍一种高精阶乘的实现,将每次阶乘的计算结果放入数组中储存,而每次结果由高精的数组元素乘与低精的整型元素得来高精数组每一位 * 低精度普通类型 = 高精数组每一位两个至关重要的变量:int ws=1;//储存位数 int jw=0;//储存进位代码核心:for( i=2;i<=x;i++){//单精度普通类型 ...原创 2020-03-24 11:30:20 · 431 阅读 · 0 评论 -
埃氏筛法
当我们要求一段范围内的素数,并且数字范围比较广时,用普通的方法肯定会导致超时,这是我们不妨用埃氏筛法来解决;用途:求一定范围内的素数步骤:(1)先把1删除(现今数学界1既不是质数也不是合数)(2)读取队列中当前最小的数2,然后把2的倍数删去(3)读取队列中当前最小的数3,然后把3的倍数删去(4)读取队列中当前最小的数5,然后把5的倍数删去(5)读取队列中当前最小的数7,然后把7的倍...原创 2020-02-17 09:40:24 · 861 阅读 · 0 评论 -
【动态规划】背包问题(01背包,完全背包,多重度背包)
对于背包问题用文字很难描述清楚也很难理解,所以本篇仅描述基本框架,仅供学习参考!!!背包问题:给定一组物品,每种物品有自己的重量和价格,在限定的重量内,我们如何选择,才能使物品的总价格最高。三种背包:01背包:每个物品只能选择一次完全背包:每个物品选择次数不限制多重度背包:每个物品只能选择限定次数一、01背包问题描述:有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。第 i件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大原创 2020-07-15 18:29:47 · 1710 阅读 · 1 评论 -
Dijkstra算法-单源最短路+堆优化
用于求某一个点到所有点的最短路径算法思想:每次找到离源点最近的一个顶点,然后以该顶点为中心向下扩展,最终得到源点到其余所有点的最短路径。说明:dis[]数组储存离源点的所有点的最短路径,比如源点是1,dis[2]=3,表示顶点2离源点的最短路径为2执行步骤:1.将所有点的顶点分为两部分:已知最短路径集合p和未知最短路径的集合Q。最开始,已知最短路径的顶点集合P只有源点一个顶点。我们这里用...原创 2020-05-07 19:02:41 · 404 阅读 · 1 评论 -
最短路径-Floyd-Warshall算法
在求最短路时,通过深搜和宽搜可以解决,但是使用Floyd-Warshall会有更高的效率只用五行代码求最短路径!!!案例:a城市到b城市有许多公路,有些城市则没有,为了节约经费,求出a到b的最短路程以下为例,两地路程用邻接矩阵表示试想通过以往的经验,如果任意两点(例如顶点a到顶点b)之间的距离路程缩短,只能引入第三个点(顶点k)并通过k中转即a→k→b,才能缩短a到b的路程,那么中转1~...原创 2020-04-27 19:27:41 · 648 阅读 · 0 评论 -
图的遍历
本文参考书籍《啊哈!算法》一.深度优先算法进行图的遍历遍历图,首先找到一个未走过的点作为起始顶点,我们这里一1号顶点作为起始顶点,深度优先搜索遍历顺序如下显然,深度优先搜索是沿着图的某一条边遍历直到末端,然后回溯,在沿着另一条边进行同样的遍历,直到所有点被访问完为止,在我们用代码实现最先要解决的问题就是:如何储存一个图?这里使用邻接矩阵法进行储存,用一个二维数组储存,第i行第j列表示顶...原创 2020-04-27 17:21:05 · 217 阅读 · 0 评论