- 博客(26)
- 资源 (2)
- 收藏
- 关注
原创 基础篇——数论基础
数论基础主要有三点。1.最大公约数。2.素数问题。3.快速幂取模。一:最大公约数正常的思路,求最大公约数都是从2开始到n-1求最大能整除的数即为最大公约数。但这样算的时间为o(n),相当耗时。故在求最大公约数时,提出了辗转相除法。现有a,b两个数,a除以b的商和余数分别是p和q,所以a=b*p+q,所以gcd( b , q )整除a,b故而整除gcd( a ,b )。反之因为q=a-b
2016-01-20 15:09:42 2146
原创 高级篇——Dinic最大流算法
#include #include #include #include #define INF 9999999using namespace std;int n,m;int c[205][205],dis[205];int BFS(){ queueque; memset(dis,-1,sizeof(dis)); dis[1]=0; que.pus
2016-01-08 16:22:06 2472 1
原创 HDU 1075——Trie树
http://acm.hdu.edu.cn/showproblem.php?pid=1075#include #include #include #include using namespace std;char a[3005],b[15];typedef struct TrieNode{ bool end; struct TrieNode *next[26]
2015-12-29 20:08:40 472
原创 HDU 1251——Trie树
http://acm.hdu.edu.cn/showproblem.php?pid=1251#include #include #include #include using namespace std;char a[15];typedef struct TrieNode{ int cnt; struct TrieNode *next[26];}Trie;
2015-12-29 19:05:09 427
原创 中级篇——字典树(Trie树)
Trie树也叫字典树,查新效率高且适用于字符串查找。相关例题HDU 1671,1251,1075,1247字典树由链表构成,以查询英文字母组成的例题为例。建立字典树时,每个节点都有26个子节点,代表其后可能出现的26个英文字母。且每个节点还需要一个bool型的参数end,当end=true时,说明该节点是一个单词的结尾字母。建立字典树需要一个根节点root,root不存储任何信息,初始化时
2015-12-28 19:55:58 583
原创 HDU 1671——Trie树应用
http://acm.hdu.edu.cn/showproblem.php?pid=1671#include #include #include #include #include #include #include using namespace std;int T,n;char num[10005][15],phone[15];bool flag;typedef st
2015-12-28 16:40:04 368
原创 POJ 2676/2918——数独DFS
广搜算法能有效求解最短路问题,深搜算法可以巧解数独类的问题,以POJ2676和2918为例POJ 2676:http://poj.org/problem?id=2676不完整的数独,0代表未填入数字,把数度补充完整分析:对于一个数x,填入数独是需要看其所在行和列是否有与其相等的值,我们需要定一两个数组row[ ][ ] 和col[ ][ ] 。row[ i ] [ j ] 表示数值 j
2015-12-27 13:39:21 396
原创 POJ2251——BFS三维迷宫
POJ2251:http://poj.org/problem?id=2251题意:输入l,r,c 三个数,代表一个 l 层的 r * c 大小的迷宫,S表示起点,E表示终点,‘ . ’表示可以走,‘#’表示走不了,求从起点到终点的最少步数,若走不出则输出“Trapped!”分析:是不是被吓住了!!!其实就是比二维的迷宫多了上下两个点而已,写入BFS算法就是了。代码:#include
2015-12-26 19:12:24 558
原创 POJ3669——BFS经典
典例POJ3669:http://poj.org/problem?id=3669题意:有n个点,每个点在一个特定的时刻 t 会被小星星砸中,其上下左右四个点也会受连累,依次输入n个点的横纵坐标及被砸的时间。现在从原点出发,问最少经过多久才能安全?若不能逃脱则输出-1分析:建立一个记录被砸时间的数组bt[ ][ ],输入数据时,先初始化所有的点为INF。再建立二维数组vis[ ][ ]监视每
2015-12-26 16:16:11 774
原创 中级篇——普通搜索之BFS
上一篇讲了DFS算法,特点是不撞南墙不回头,这一片讲讲与之相反的广度优先搜索(BFS)。形象的说,广搜是从根节点V0出发,遍历其未访问过的子节点W1,W2......接着从其子节点出发遍历W1未访问过的子节点,完事遍历W2未访问过的子节点,以此类推完成广搜遍历。因此,广搜算法在深搜算法的基础上需要多一个用于记录下一个根节点的队列que[ ],只要每访问到一个未被访问过的节点,便将节点加入队尾,
2015-12-25 16:49:02 361
原创 POJ2386——经典的DFS
http://poj.org/problem?id=2386题意:n*m的院子,‘ W ’代表有水,‘ . ’代表无水,若一个格子的八个方向存在‘ W ’则可以看做一个水塘,求一共有几个水塘分析:经典的DFS,从第一个点开始遍历,只要发现其为‘ W ’便将他变为‘ . ’,之后遍历它的八个方向,如果发现有‘ W ’存在则重复上述操作。#include #include #inclu
2015-12-25 12:47:51 331
原创 中级篇——普通搜索之DFS
深度优先搜索(DFS)和广度优先搜索(BFS)是搜索问题中比较常见的方法。此篇介绍DFS算法思想。现有n个点,m条边,每条边按照起点和终点输入。为表示点与点之间存在边,需要建立一个邻接矩阵a[ n ] [ n ],a[ i ] [ j ]=1表示 i 与 j 两点间存在边,反之为0(邻接矩阵限于小数据量)。另外还需设一个一维数组vis[ n ],vis[i]==1表示第 i 个节点已被访问过,
2015-12-24 18:53:54 406
原创 中级篇——背包问题3(多重背包)
上一篇讲的完全背包是指在所有物品件数无限多的情况下选择最值,现在引申出多重背包问题,即各物品个数均有限且不一定相同,求轙类情况下的最值。
2015-12-17 14:01:46 18370 5
原创 中级篇——背包问题2(完全背包)
01背包是指每件物品有且只有一件,而完全背包则是每件物品件数无限,求装入背包所对应的最值。完全背包也有公式,在01背包公式的基础上加以改动。完全背包公式:dp [ j ] =min/max( dp [ i ] [ j ] ,dp [ j - w [ i ] ] + v [ i ] ) 。给出一道例题加以分析。典例:http://acm.hdu.edu.cn/showpro
2015-12-16 20:48:57 1034
原创 中级篇——背包问题1(01背包)
N件物品,没见有重量Wi,价值Vi;选其中几件放入容量为M的背包中,求最大价值。——经典背包问题背包问题分三类:1.01背包:每件物品仅一件,可以不将背包装满(要么取0件要么1件) 2.完全背包:每件物品仅一件,须将背包装满。 3.多重背包:每件物品可不止一件,可
2015-12-15 12:21:53 794
原创 中级篇——优先队列
优先队列与一般队列不同,插入新元素时不是直接将新元素插入到队尾,而是根据优先级插入到其所在优先级的相应位置。优先队列分为两种:最大优先队列和最小优先队列。故每次取出的是队列中最大优先级和最小优先级。可以根据默认的优先级排序也可自定义优先级排序。所需头文件:“queue.h”和“functional.h”。一、优先队列支持的操作q.size(); //返回队列元素个数q.empt
2015-12-11 12:24:30 299
原创 C++类和继承
C++与C语言类似,运算效率高,与java也有相似之处一:基础1.输入:C语言中使用scanf来输入,需要声明变量的类型,头文件include。 C++中只需要“cin>>变量”即可实现,头文件include。2.输出:C语言输出用printf执行,也需要声明变量的类型。 C++用“cout二:类与继承类在
2015-10-31 18:21:30 1404
原创 中级篇——图的最小割点
给出一幅图:现在需要去掉一个点,使得全图不再连通,如何完成?通过观察图可以发现在除去顶点2后,定点5,6无法连通,故顶点2是本图的割点。如何完成这一算法呢?我们结合深度搜索来实现。首先引入一个概念——时间戳。时间戳就是记录顶点在遍历时第几个被访问,例如上图我们定义num[]数组记录时间戳,以1为起点开始,则num[1]=1;接下来是顶点3,故num[2]=3,即3号顶点时间戳为2。以此
2015-10-24 12:48:25 488
原创 中级篇——最小生成树
最小生成树可以解决一类最短路径问题,现在给出一幅图:每条路上的数值代表权值。现在需要从1到6找一条最便捷的路径。第一步:从1出发有1——2,1——3,两条边。1——2比1——3短,故先连通1——2。第二步,接下来看1——3,2——3,2——4,三条边,1——3和2——3都能连通1,2,3三个点,但1——3明显小于2——3故连通2——3.接下来,最短的边是4——6
2015-09-22 19:40:26 442
原创 中级篇——Dijkstra算法求最短路径
在讲Bellmen算法时提到过Dijkstra算法,其在处理稠密图时的时间优于Bellmen算法,但缺点是不能处理带有负边权值的路径问题。 Dijkstra算法需要定义一个二维数组e[n][n](n表示一共n个点),每个单元存放一个值,e[i][j]表示i点到j点的距离,e[i][i]的点距离均设为0(自己到自己距离为0)。此外还需要一个一维数组dis[n],来记录起始点到每个点
2015-09-16 18:06:02 484
原创 基础篇——队列,栈
队列与栈(一)队列 经典例题:一串长为n加密的数字,解密法则如下——将第一个数删除,再把第二个数放到末尾,删除第三个数,将第四个放到末尾。。。。。。直到剩下最后一个数,将最后一个数删除。按照之前删除的顺序,把这些数连在一起便是源码。 例:所给长为9的数串“6 3 1 7 5 8 9 2 4” 第一步:删6移3——>1
2015-09-15 10:29:56 257
原创 中级篇——Bellmen算法求最短路径
Bellmen算法是求最短路径的最方便的算法之一,SPFA算法更方便,是Bellmen算法的队列实现但队列不会,掌握Bellmen算法即可解决大部分最短路径的问题。Bellmen算法的最大优势就在于可以解决边权值为负的情况。(限于有向图)典例:给n个点,m条路径,求A点到B点的最短路径。需要开设dis[]记录,dis[i]即到达i点的最短距离,输出时输出dis[i]即可。#includ
2015-09-12 18:36:32 518
原创 基础篇2——贪心法
贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。经典例题:一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2 5
2015-09-01 19:51:33 1348
原创 中级篇——并查集
一:构成有一个整型数组,两个函数构成。数组pre[]记录每个点的前导点,函数find查找,join合并。二:算法思路以hdu1232为例:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
2015-09-01 09:44:51 253
原创 中级篇——斐波那契数列详解
斐波那契主要分为以下题型:1.求具体某项的值(一般在45项以内,打表即可)2.求具体某一项模K(通常是个大数项,一般采用矩阵法)3.求斐波那契前几位数字(例如:HDU 的 3117 题)4.求解 Fibonacci 的后多少位,这个和取模类似5.求前n项和(矩阵法)最常用最好用的——矩阵法 需要用到线性代数矩阵相乘的方法例:HIT 2060A
2015-08-31 13:46:08 649
原创 基础篇1——二分查找法
二分法即设头,尾,中三个变量以low,high,mid表示。mid=(low+high)/2,每次以mid对应的值进行比较,若索要查找的值>mid对应的值,则low=mid,反之high=mid。之后再以新的low,high求新的mid对应查找,直至找到。部分时候以high>=low作为条件避免重复查找。类型一:二分法求解例:8x^4+7x^3+2x^2+3x+6=y,输入y的值,
2015-08-31 13:06:24 453
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人