算法
卑微小童
痴迷于技术无法自拔
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
SPFA
目录SPFA原理代码实现:优化判断负环方法一方法二方法三SPFA与BFSSPFA与DFSSPFASPFA 算法通常用于求含负权边的单源最短路径,以及判负权环。在正权图上应使用效率更高的Dijkstra算法。若给定的图存在负权边,类似Dijkstra等算法便没有了用武之地原理我们约定加权有向图G不存在负权回路,即最短路径一定存...原创 2019-11-22 21:25:33 · 405 阅读 · 0 评论 -
依赖背包
依赖背包问题来源:P1064 金明的预算方案(NOIP2006)背包中的物品存在依赖关系,也就是说,如果选i物品,就必须选择j物品,j为主件,i为附件分析按照背包的一般思路,我们可以考虑对所有的主件进行dp选择,然后在选择每一个主件的时候再枚举附件,当然这个题只是每个主件最多只有2个附件,所以这就只有5个策略,但是如果我们推广到n呢,策略则有2n+1之多,为指数级。我们在上边的基础上,我...原创 2019-09-28 17:41:32 · 1200 阅读 · 0 评论 -
dijkstra算法及优化
dijkstra算法dijkstra(迪杰斯特拉)算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。代码:int n,m;//n是点的个数,m是边的个数int map[maxn][maxn];//邻接矩阵,初始化INF(较大值)int dis[maxn];//dis[j]是起点到j的长度,是在极端中...原创 2019-11-20 19:39:30 · 808 阅读 · 0 评论 -
链式前向星存图
图的常用存储结构有邻接矩阵和邻接表,但我们知道邻接矩阵空间浪费太严重,邻接表不好写。所以出现了的另一种常用的存储结构:前向星和链式前向星,介于上述两种存储结构之间的一种比较均衡的存储结构。其中,因为向前星存图需要排序,时间复杂度方面较高,所以我们学习链式的向前星存图存储结构:struct edge{ int w;//长度 int last;//相同起点的边的位...原创 2019-11-20 18:24:58 · 327 阅读 · 0 评论 -
线段树
线段树高效地询问和修改一个数列中某个连续区间的信息原理:将[1,n]分解成若干特定的子区间然后,将每个区间[L,R]都分解为少量特定的子区间,通过对这些少量子区间的修改或者统计,来实现快速对[L,R]的修改或者统计。用线段树统计的东西,必须符合区间加法,否则,不可能通过分成的子区间来得到[L,R]的统计结果。(区间加法:通过子树的结果可以得到父节点的信息)例如:数字之和 =左区间+右区...原创 2019-09-30 13:26:01 · 99 阅读 · 0 评论 -
Floyd算法
分析:通过一个图的权值矩阵求出它的每两点间的最短路径矩阵scanf("%d%d",&n,&m);for(i=1;i<=n;i++) for(j=1;j<=n;j++) { d[i][j] = INF;//初始化d[][]数组 }for(i=0;i<m;i++){ scanf("%d%d%d",&x,...原创 2019-09-27 09:40:33 · 194 阅读 · 0 评论 -
快速幂之矩阵快速幂
先看快速幂根据一般的快速幂我们可以得出矩阵的快速幂矩阵的乘法以方阵a和b为例void multi(int a[][maxn],int b[][maxn]){ //a,b都是n*n的矩阵 int c[maxn][maxn]={0}; for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(in...原创 2019-11-16 19:04:40 · 122 阅读 · 0 评论 -
欧几里得算法
欧几里得算法定理1:gcd(a,b) = gcd(b,a-b)(a>b)证明:令c = gcd(a,b) , a = mc , b = nc有:a-b = (m-n)c , gcd(b,a-b) = gcd(nc,(m-n)c)假设: n与m-n 存在除1之外的公因数 L ,则有n = k1L, (m-n) = k2Ln/k1 = (m-n)/k2 ...原创 2019-11-16 17:39:23 · 280 阅读 · 0 评论 -
位运算
交换a和b数值 b=a^b; a=a^b; b=a^b;原创 2019-10-20 10:25:59 · 122 阅读 · 0 评论 -
扫描线
HDU 1542 Atlantis如图,我们来求两个矩形所覆盖的总面积我们先定义一条平移于y轴的扫描线(如图,黄线标识),另其从左到右逐个扫描每个所给矩形的竖边,我们命名为线1,线2,线3,线4(横坐标为下,x1,x2,x3,x4),每个矩形的纵坐标的上下限依次为y1 y2 y3 y4当扫描线从线1扫描到线2的时候,扫描到的面积为s1=(y3-y1)*(x2-x1)当扫描...原创 2019-10-11 20:25:32 · 225 阅读 · 0 评论 -
启发式搜索
例题:八数码问题原创 2019-10-10 14:26:38 · 377 阅读 · 0 评论 -
优先队列
priority_queue普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 的行为特征。通常采用堆数据结构来实现头文件#include < queue >模板:priority_queue<Type, Container, Functiona...原创 2019-10-10 14:11:04 · 129 阅读 · 0 评论 -
欧拉筛法与埃氏筛法(求素数)
埃氏筛法基本思想 :从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的.代码实现:int vis[maxn]={0}; void prime(){ vis[0] = vis[1] = 1; //0 和 1不是素数 for (int i = 2; i <= maxn; i++) { if (!vis[i]) { ...原创 2019-08-17 09:08:27 · 226 阅读 · 0 评论 -
分解质因数
输出n的质因数#include<iostream>using namespace std;int main(){ cin>>n; for(int i=2;i*i<=n;i++) { while(n%i==0) { cout<<i<<' '; ...原创 2019-08-17 17:22:29 · 152 阅读 · 0 评论 -
排序
一、冒泡排序二、快速排序1、将数组中的一个数作为基准数base2、将数比base的小的放到左边(左区间),把数比base大的放在右边(右区间)3、采用分治的思想,重复1、2过程,直到区间内只有一个数,排序完成#include<iostream>using namespace std;int a[10]={1,3,4,8,7,5,2,0,9,6};void dis(int...原创 2019-08-17 20:37:36 · 125 阅读 · 0 评论 -
取球博弈
取球博弈今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。我们约定:每个人从盒子中取出的球的数目必须是:1,3,7或者8个。轮到某一方取球时不能弃权!A先取球,然后双方交替取球,直到取完。被迫拿到最后一个球的一方为负方(输方)请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A...原创 2019-08-31 15:08:05 · 291 阅读 · 0 评论 -
大数的乘法
大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。输入a b输出a*b原理(模仿乘法运算)将大数的每个位上的数都用数组存起来,数的高位存到数组下标大的位置以将a存到a[]数组中,b存到b[]数组中,长度分别是lena和lenb 为例定义一个数组c[]存储结果则将a每一位与b相乘得到的数加到相应的位 for(int i=0;i<len1;...原创 2019-09-18 12:59:10 · 258 阅读 · 0 评论 -
尼姆博弈
问题来源:POJ 2234 Matches Game问题描述有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜给定 n ,以及n怼物品各自的数量,求先手是否能赢得比赛题目分析在博弈游戏中存在两种状态:必胜状态和必败状态一个状态是必败状态当且仅当它的所有后继都是必胜状态一个状态是必胜状态当且仅当它至少有一个后继是必败状态定理:将每个堆...原创 2019-09-28 19:33:54 · 220 阅读 · 0 评论 -
树状数组
树状数组与线段树一样,都是对一个数组进行更新和查询的一种相对高效的算法区别(树状数组与线段树)两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树. 树状数组的作用被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树一定可以解决, 但是线段树能够解决的问题树状数组未必能够解决. 树状数组的突出特点是其编程的极端简洁性, 使用lowbit技术可...原创 2019-10-04 22:47:46 · 168 阅读 · 0 评论 -
并查集
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中,用一般的数据结构很难符合时间要求,所以只能通过并查集来求解 初始化 把每个点所在集合初始化为其自身。int parent[maxn];void initialise(){ for(int i=0;i...原创 2019-10-08 17:00:24 · 133 阅读 · 0 评论 -
全排列
原理:递归全排列的过程实际上是数组从左到右逐个确定每个位置的字符,直到每个位置的字符都被确定,一种情况即被排列完成。通过递归遍历所有的情况,全排列即被完成。代码:char s[maxn];void perm(int k,int n){ // //全排列:Full Permutation.排列的第K个位置 if(k==n){ for(int i=1;i<=n;i++){ ...原创 2019-10-09 15:51:40 · 125 阅读 · 0 评论 -
快速幂
快速幂——反复平方法一、原理以ab为例介绍:最基础的算法是将a连乘b次,但当幂值足够大的时候,这只能够算法显然是无法接受的以b=11为例,11的二进制位1011,所以**211=212228其中1 ,2,8分别对应二进制数1011各个含有1位上的权值那么求211改为求21*22*28如果我们知道在这里插入代码片...原创 2019-08-16 20:07:32 · 151 阅读 · 0 评论
分享