- 博客(7)
- 收藏
- 关注
原创 Floyd算法
Floyd算法 本文主要讲解的是Floyd算法,这同样是经典的最短路算法之一。不同的是,如果要求出一个图上任意两点间的最短路径,我们无需调用n次Dijkstra算法,这时Floyd算法便有了用武之地。另外,该算法同样适用于存在负权的情况。 Floyd算法本质上是动态规划,核心是动态转移方程,重点在于分析与推导。下面我们就来分析问题。从点i到点j的最短路径不外乎有两种可能:第一种是直接从i到j
2017-12-08 10:36:03 234
原创 SPFA算法
SPFA算法 本文主要讲解的是SPFA算法(即Bellman-Ford算法的队列优化版)。该算法也是用于一种著名的求解单源最短路的算法。 上篇文章,我们详细讲解了Dijkstra算法的原理以及实现。(若没有学过,请先前往学习)多次强调的一点是,Dijkstra算法只适用于正权图的单源最短路。而对于存在权值为负的边的图,我们用的是SPFA(Shortest Path Faster Alg...
2017-12-08 10:30:31 927
原创 Dijkstra算法
Dijkstra算法 本文主要讲解的是一种著名的图论算法——Dijkstra算法。该算法由荷兰计算机科学家Dijkstra于1959 年提出,是一种经典的用于计算正权图上的单源最短路的算法。所谓单源最短路(Single-Source Shortest Path, SSSP),指的是从一个结点出发到其他所有结点的最短路。 简单介绍Dijkstra算法的基本思想。 设G=(V,E)是一个正
2017-12-07 16:40:21 382
原创 Prim算法
Prim算法 本文主要讲解的是Prim算法,该算法用于寻找最小生成树(MST)。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。(上一篇博客是Kruskal算法,如果没学过的话建议先移步去学习Kruskal算法) Prim算法于1930年由捷克数学家沃伊捷赫•亚尔尼克发现;并在1957年由美国计算机科学家罗伯特•普里姆独立发现;1959年,
2017-12-06 08:16:24 552 1
原创 Kruskal算法
Kruskal算法 本文主要讲的是Kruskal算法,这是一种常用的用于寻找最小生成树的算法,由Joseph Kruskal于1956年发表。它是贪心的思想,易于编写,而且效率很高。 何为“最小生成树”呢?在一给定的无向图G = (V, E)中,(u, v)代表连接顶点u与顶点v的边,而w(u, v)代表此边的权重。连接G中所有的点,且边集T为E的子集的树(无环图),称为G的生成树(Span
2017-12-01 22:28:02 1230
原创 快速排序
快速排序 本文主要讲解的是快速排序。快速排序是最快的通用内部排序算法,它由C. A. R. Hoare在1962年提出。 快速排序采用的是分治的思想。基本原理如下:先找出一个元素(理论上可以随便找一个,但通常选取数组的第一个数)作为基准,然后对数组进行划分操作,使基准左边元素的值都不大于基准值,基准右边元素的值都不小于基准值。这样一来,作为基准的元素已经调整到其正确位置上。再不断重复上述操作
2017-11-30 17:26:26 181
原创 Eratosthenes筛法
Eratosthenes筛法Ps.这是本人写的第一篇博客,故必有不足之处,希望大家多多包涵,并提出好的意见与建议。我自己曾经是一名OIer,所以深知初学者学算法的不易。之后我会不定期地写一些介绍算法的文章与大家分享,还请各位支持! 那么,回归正题,本文主要讲解“Eratosthenes筛法”。 现考虑一个问题:如果要求出从1到n的所有素数,该怎么做呢?当然我们可以一个一个来判断是否为素数,但这显
2017-11-29 21:18:27 713 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人