算法详解
文章平均质量分 86
ACM/ICPC算法详解
柠檬ya
不要慌,不要慌,太阳下了有月光
展开
-
最小生成树(Prim算法+Kruskal算法)
概述:一个有N个点的图,边一定是大于等于N-1条的。图的最小生成树,就是在这些边中选择N-1条出来,连接所有的N个点。这N-1条边的边权之和是所有方案中最小的。Prim算法介绍:Prim算法采用与Dijkstra、Bellman-Ford算法一样的“蓝白点”思想:白点代表已经进入最小生成树的点,蓝点代表未进入最小生成树的点。由于图中各点都是连通的,要想一条路上的总权值最小,那么最好......原创 2019-10-24 19:51:21 · 1394 阅读 · 1 评论 -
背包DP问题(01背包+完全背包+分组背包+多重背包+混合背包+二维费用的背包)
背包DP问题01背包问题一、01背包问题问题:有N件物品和一个容量为V的背包。第i件物品的费用(即体积,下同)是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[i][v]表示前i件物品(部分或全部)恰放入一个容量为v的背包...原创 2019-08-17 11:44:39 · 1303 阅读 · 0 评论 -
图论----最短路径(Dijkstra算法 + 堆优化)
【概述】Dijkstra算法用于解决单源最短路径问题,也就是从某一点c1到终点c2的最短路径,但无法处理负边权情况。未使用优先队列(堆优化)的算法复杂度为O(N2),使用优先队列优化后的算法复杂度大概为O(NlogN),下面会一一进行介绍。【算法描述】Dijkstra算法可以简单的理解为广度优先搜索(BFS)加上贪心算法,因为他是从源点开始像四周搜寻路径最短的点,再从相邻的最短的点继续向四...原创 2019-09-02 17:19:27 · 3990 阅读 · 7 评论 -
图论----最短路径(Floyd算法)
【概述】Floyed-Warshall算法用来解决全源最短路径问题,简单来说就是求出任意一点c1到任意一点c2的最短路径,算法复杂度O(n3)。【算法描述】Floyed-Warshall算法暴力求出全源最短路径,首先选出一个转折点k,然后遍历所有节点,以k为转折在去遍历所有节点,每次询问 e[i][j] > e[i][k] + e[k][j] ?(e[i][j]表示从i -> j...原创 2019-09-02 17:45:16 · 638 阅读 · 0 评论 -
图论----最短路径(Spfa算法)
概述SPFA算法O(kE,k是常数,平均值为2,是Bellman-Ford算法的队列实现),Bellman-Ford算法主要是处理负权边问题,但无法处理负回路,只能判断是否为负环。算法描述dis数组用来存储从源点到各个点的路径长度,vis用来标记是否已经被走过,这里注意,每次取出队头元素,对所有点进行遍历时要对每个点进行标记,但处理完之后要把对头元素重新标记为true,这样才不会影响下面的计...原创 2019-09-06 20:47:21 · 246 阅读 · 0 评论 -
并查集(偏移量+路径压缩)
并查集的概念:并查集是由一个数组、两个函数(查找一个数的根、合并路线)组成,常用来解决一些不相交集合的合并与查找问题。并查集中有2个重要的函数:一个用来寻找祖先,一个用来合并祖先:节点指向自身int find(int x) //寻找x的祖先,这里为了节约时间使用了路径压缩{ return x == p[x] ? x : p[x] = find(p[x]);}路径压缩:下图r...原创 2019-09-25 17:17:36 · 1103 阅读 · 0 评论 -
欧拉路和欧拉回路
欧拉路径的定义:如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。欧拉路径以及欧拉回路的判断:奇点的定义:指跟这个点相连的边数目有奇数个的点。定理1:存在欧拉路的条件:图是连通的,有且只有2个奇点...原创 2019-09-26 10:02:50 · 665 阅读 · 0 评论 -
素数表----欧拉筛法
欧拉筛法欧拉筛法的数学原理:欧拉函数:在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler’s totient function),它又称为Euler’s totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。欧拉筛法可以用于对给定区间内的所有素数进行打表,欧拉筛法大幅度提...原创 2019-08-05 09:41:19 · 1998 阅读 · 0 评论 -
素数表----埃式筛法
埃式筛法计算整数区间[2,n]中的所有素数的最为简便的筛法——埃拉托斯特尼筛法(The Sieve of Eratosthenes):设u[]为筛子,初始时区间中的所有数在筛子u[]中。按递增顺序搜索u[]中的最小数,将其倍数从u[]中筛去,最终筛中留下的数即为素数。时间复杂度:O(n * log log n)代码:#include <iostream> //埃式筛法#i...原创 2019-08-05 09:58:22 · 584 阅读 · 0 评论 -
快速幂算法
快速幂算法快速幂算法用于快速求出a的b次方的值,为了防止程序溢出,通常会在运算过程中对每次的运算结果取模快速幂算法模板:#include <bits/stdc++.h>using namespace std;typedef long long LL;LL mod = 1e7+7; //数字较大时为了防止溢出,通常要进行取模运算LL qmod(LL p , LL...原创 2019-08-07 15:31:42 · 472 阅读 · 0 评论 -
结构体内嵌的operator排序
结构体内嵌比较函数:第一种情况简单的sort排序:struct node{ int a; int b; bool operator < (const node &t)const { return a > t.a; }};这里内嵌的比较函数是按照a的值递减,但如果需要优先队列,且需要递减排列,那就需要写成这样:...原创 2019-09-03 18:27:46 · 2403 阅读 · 0 评论