算法
文章平均质量分 58
IT_xiaolaoshu
Big_laoshu
展开
-
算法训练 数字三角形
问题描述 (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大。 ●每一步可沿左斜线向下或右斜线向下走; ●1<三角形行数≤100; ●三角形中的数字为整数0,1,…99; . (图3.1-1)输入格式 文件中首先读到的是三角形的行数。 接下来描述整个三角形输出格式 最大总和(整数)样例输入5原创 2017-04-05 08:48:05 · 403 阅读 · 0 评论 -
图的遍历算法-深度优先搜索算法(dfs)和广度优先搜索算法(bfs)
一、前提须知图是一种数据结构,一般作为一种模型用来定义对象之间的关系或联系。对象:顶点(V)表示;对象之间的关系或者关联:通过图的边(E)来表示。一般oj题中可能就是点与点,也有可能是具体生活中的物体图分为有向图和无向图,图的存储使用邻接矩阵(即二维数组)或者邻接表。图的最基本操作就是图的遍历,深度优先搜索算法(dfs)和广度优先搜索算法(bfs)是图遍历操作的2种方法。这2钟方法对于无向图和有向...原创 2018-02-12 17:15:36 · 1806 阅读 · 0 评论 -
最小生成树-prim算法和kruskal
前提: 生成树是建立在无向图的基础上的,所以下面的讨论都是在无向图上进行的。 直观的一个应用就是:有n个村庄,现在要在这些村庄之间修一些路,其中村庄i和村庄j之间的距离是Dij,现在要修最短的路使得所有村庄连接起来。最小生成树( MIT )的经典解决方法有2种:prim算法和kruskal算法。1.prim算法 算法思想:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该...原创 2017-11-10 11:18:35 · 334 阅读 · 0 评论 -
单源最短路径之dijkstra算法
前提: 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同。如果是一个带权图,那么路径长度为路径上各边的权值的总和。两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度。最短路径在实际中有重要的应用价值。如用顶点表示城市,边表示两城市之间的道路,边上的权值表示两城市之间的距离。那么城市A到城市B连通的情况下,哪条路径距离最短...原创 2017-11-21 17:45:28 · 569 阅读 · 0 评论 -
欧拉路径-欧拉回路
概念欧拉回路:从图的某一个顶点出发,图中每条边走且仅走一次,最后回到出发点。如果这样的回路存在,则称之为欧拉回路。欧拉路径:从图的某一个顶点出发,图中每条边走且仅走一次,最后到达某一个点。如果这样的路径存在,则称之为欧拉路径。无向图, 欧拉回路存在条件:所有顶点的度数均为偶数。无向图, 欧拉路径存在条件:至多有两个顶点的度数为奇数,其他顶点的度数均为偶数。有向图, 欧拉回路存在条件:所有顶点的入度和原创 2017-11-17 18:22:57 · 531 阅读 · 0 评论 -
线段树
线段树作为一种十分常用的数据结构,在NOIP、NOI中广泛的出现线段树支持对一个数列的求和、单点修改、求最值(最大、最小)、区间修改。这几种操作,时间复杂度是(logn)级别的。具体的操作一般是每次对数轴上的一个区间或是数列中的连续若干个数进行一种相同的处理一.引例示例1.区间最值问题 给定一个n(n <= 100000)个元素的数组A,有m(m <= 100000)个操作,共两种操作:原创 2017-11-05 20:00:13 · 294 阅读 · 0 评论 -
qsort函数、sort函数
qsort函数和sort函数都可以对连续内存的数据进行排序 1.qsort(即quicksort) 头文件:stdlib void qsort( void *base, size_t num, size_t width, int (__cdecl *compare ) int compare (const void *elem1, const void *elem2 ) );参数意义如下:第原创 2017-09-25 09:32:55 · 425 阅读 · 0 评论 -
从零开始学贪心算法
本文在写作过程中参考了大量资料,不能一一列举,还请见谅。贪心算法的定义: 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的 状态,只与当前状态有关。解题的一般步骤是: 1.建立数学模型来描转载 2017-08-09 15:56:28 · 5808 阅读 · 0 评论 -
求质数算法之试除法
需求:求得一定范围内的素数。 方法: 试除法:1.顾名思义,就是不断地尝试能否整除。比如要判断自然数 x 是否质数,就不断尝试小于 x 且大于1的自然数,只要有一个能整除,则 x 是合数;否则,x 是质数。 但是根据上述写出来的固然可以得到素数,但是花费时间过多。以下是越来越简化的思路:思路1. 德巴赫猜想,一个偶数可以分解为两个素数之和,其中一个必然小于或等于这个偶数的一半。所以不断尝试小原创 2017-07-19 16:44:04 · 2883 阅读 · 0 评论 -
快速排序
快速排序采用分治思想分解: 数组A[p..r]被划分为两个(可能为空)子数组A[p…q-1]和A[q+1..r],使得A[p…q-1]中每个元素都小于等于A[q],而A[q]也小于等于 A[q+1..r]中的每个元素,其中,计算小标q也是划分过程中的一部分。 解决: 通过递归调用快速排序,对子数组A[p…q-1]和A[q+1..r]进行排序。 合并: 因为子数组都是原址排序的,所以不需要合并操原创 2017-08-07 18:06:49 · 245 阅读 · 0 评论 -
插入排序
算法导论第三版9页 应用插入排序,进行简单数组排序#include<stdio.h>#define max 100int main(){ int i,j,n,key; int arr[max]; scanf("%d",&n); getchar(); for(i=0;i<n;i++) scanf("%d",&arr[i]); for(j=1;j<原创 2017-07-09 11:25:21 · 398 阅读 · 0 评论 -
求质数之Eratosthenes筛选法(C++版)
Eratosthenes计算小于100000的素数质数:时间复杂度是O(nloglogn)算法原理 一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。 二、步骤 (1)先把1删除(1既不是质数也不是合数) (2)读取队列中当前最小的数2,然后把2的倍数删去 (3)读取队列中当前最小的数3,然后把3的倍数删去 (4)读取队...原创 2017-07-16 09:21:46 · 1083 阅读 · 0 评论 -
全错排
经典问题: 十本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有几种摆法?考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排。在写信时将n封信装到n个不同的信封里,有多少种全部装错信封的情况?四人各写一张贺年卡互相赠送,有多少种赠送方法?自己写的贺年卡不能送给自己思想:当n个编号元素放在n个编号位置,元素编号与位置编号各不对应...原创 2018-03-28 20:22:37 · 381 阅读 · 0 评论