算法
文章平均质量分 71
Pekary
Read the tea leaves.
展开
-
(2)排序之堆排序
首先介绍一下堆的概念:堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。原创 2014-09-18 17:26:12 · 593 阅读 · 0 评论 -
Poj 3487 稳定婚姻问题
稳定婚姻问题:有n个男人,n个女人。每个人都有一个对异性的排名(1~n),假设男人主动追求女人,根据这些排名,我们需要将这些男女进行牵线,使得他们的婚姻稳定。 由于稳定不太好定义,我们定义一下不稳定。不稳定婚姻:对于任意一个男人m, 假设其当前配偶为w, 若存在一个女人w1, 其当前配偶为m1, 她在m 的排名中比 w 靠前,同时,m在 w1 的排名中比她现任丈夫m1靠前,这原创 2015-09-09 21:00:55 · 1710 阅读 · 0 评论 -
POJ2449 Remmarguts' Date 第K短路
K短路求法:SPFA+A*。简单讲讲这个A*算法。它有一个估价函数 f(x) , 定义f(x) = g(x) + h(x). 其中g(x)为从起点到当前点的代价, h(x)为从当前点到终点的代价。怎么把它用来求K短路呢?定义结构体Node,其中有成员(to, f, g),to为当前顶点,f , g和上面定义相同。在求K短路中g(x)就是重源点到当前点的路径长度,h(x)的就是当前点原创 2015-10-28 20:58:28 · 432 阅读 · 0 评论 -
hdu 2896 病毒侵袭 AC自动机
AC自动机模板。学习的是学长的写法,感觉很好。#include#include#include#includeusing namespace std;const int N = 502;const int MAX = 130;char virus[205];char web[10005];int flag[1005][5];struct Trie{原创 2015-10-07 13:22:32 · 352 阅读 · 0 评论 -
Hdu 5371 Manacher算法
Manacher算法:对于字符串str[ ], 找出所有以str[i]为中心的回文串的最长长度。#include#includeusing namespace std;const int N = 100008;int a[N];int b[N<<1];int p[N<<1];int len;void kp(){ int mx = 0, id = 0; fo原创 2015-08-13 09:59:52 · 351 阅读 · 0 评论 -
hdu 2553
N皇后问题。深搜。#include#includeint x[16],y[16];int n, num;bool isPlace(int a){ for(int i = 1; i < a; i++) if(fabs(a - i) == fabs(x[a] - x[i]) || x[a] == x[i]) return f原创 2014-08-12 14:55:47 · 476 阅读 · 0 评论 -
POJ 1639 最小度限制生成树
#include#include#include#include#include#define max(f, s) (f) > (s)? (f):(s)using namespace std;const int N = 32;const int INF = 0x3f3f3f3f;map mS2I;int num, k;int g[N][N], dis[N], max_原创 2015-08-10 14:33:05 · 403 阅读 · 0 评论 -
字符串匹配算法(KMP, BM, Sunday)
最近学习了一下字符串匹配的一些算法,在这里做一个总结。最简单的暴力匹配就不说了。原创 2015-07-29 14:46:25 · 659 阅读 · 0 评论 -
hdu 1394 最小逆序数
#include#include#define N 5005#define mid(a,b) ((a+b)>>1)using namespace std;struct{ int l, r; int v;}segTree[N*4];void build(int root, int left, int right){原创 2014-08-16 10:10:33 · 506 阅读 · 0 评论 -
树的中心
讲解的方法是按照我自己的理解来的,有任何没有说清楚的地方欢迎提问。-----------------------------------------------------------------------------------------------------网上将有关的题目不少,但是详细讲这个算法的人不多。自己对着代码琢磨了一下,对这个算法讲一讲自己的理解。首先,我们需要明白原创 2015-09-12 17:39:08 · 1642 阅读 · 0 评论 -
hdu 5389(dp)
#include#includeconst int N = 100008;const int MOD = 258280327;int arr[N];int dp[N][16];int main(){ int t; scanf("%d", &t); while(t--) { int n, a, b; scanf("%原创 2015-08-15 15:17:57 · 562 阅读 · 0 评论 -
hdu5521 Meeting 最短路 2015ACM/ICPC亚洲区沈阳站现场赛
题意:共有N个点,每si个点为一个集合,集合内部任意两点的路程所需时间为ti, 两个人分别住在点1和点N,问两人从自己住的地方,找一个点相遇,要求两人用最短的时间相遇。思路:看到这个题有点蒙,因为si中任意两点都有边,如果要表示的话相当于要建好多个完全图,而数据范围一看,肯定的爆内存。后来看到了别人写的代码,发现并不需要建立完全图,对于每个集合,我们都给它新加一个顶点,建立集合内顶点到新加顶点原创 2015-11-08 22:56:34 · 685 阅读 · 0 评论 -
poj 1459 Power Network SAP
SAP的模板题,主要是输入有点难处理,看有人用sscanf函数处理的,我是直接对字符串进行处理的。对于SAP:其实核心思想就是高度函数,把它搞懂SAP其实和EK算法本质上是一样的。还有一个重要的是GAP优化,即当高度出现断层时算法结束。#include#includeconst int N = 128;const int INF = 0x3f3f3f3f;struc原创 2015-11-18 17:17:55 · 384 阅读 · 0 评论 -
(1)排序之归并排序
这些天花了些时间学习排序算法。原创 2014-09-14 17:05:45 · 557 阅读 · 0 评论 -
树的直径 hdu 4607
树的直径定义:树中所有最短路径的最大值。定义distance(a, b)为顶点a与b之间的最短距离。用数学语言表示就是:对于一棵树 T = (V, E),彐vx, vy ∈ V, ∀ v1, v2∈V, 都有distance(v1, v2) 现在我们来用算法求解树的直径。求解过程很简单,两次BFS。(1)第一次BFS我们可以从任意顶点出发,不妨设该顶点为 t, 找到距离原创 2015-09-10 20:00:19 · 532 阅读 · 0 评论 -
差分约束系统
差分约束系统定义(引自维基百科):如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi例如,有如下不等式组:原创 2015-10-29 13:51:22 · 1039 阅读 · 0 评论 -
hdu 1016
题意:要求每两个相邻的数的和都是原创 2014-08-12 13:43:50 · 479 阅读 · 0 评论 -
poj3114 Countries in War 强连通分量+dijkstra或者DAG最短路
思路:先求出各个强联通分量,缩点,由于国家内部通信的不需要时间的,一个国内的某个城市和另一个国家内的某个城市通信等价与两个国家之间通信。之后就是一套最短路的东西了,由于缩点之后是DAG,所以可以用DAG的最短路来求,但事实证明这个没有堆优化的dijkstra快。#include#include#includeusing namespace std;const i原创 2015-11-10 16:34:10 · 369 阅读 · 0 评论 -
hdu4825 Xor Sum 字典树与异或(经典)
求某个数与一些数异或的最大值是字典树应用的一个经典问题。主要思想是贪心,把数字都转化成二进制,把这些数按存到字典树中。从高位开始遍历,如果有不同的边(可以使得异或值为1)肯定走不同的边,如果没有则走与自己值相同的边(一定存在)。边走边统计,最后输出。这道题题意是:输入一个数组,再给一些数字进行查询,问这些数字与数组中的哪个元素异或值最大。思路:把输入的数组元素全部插入字典树,然原创 2015-10-22 22:47:05 · 1955 阅读 · 0 评论 -
hdu 1325 is it a tree?
有人这道题在poj上可以很容易过,而hdu却过不了原创 2014-08-19 11:32:32 · 533 阅读 · 0 评论 -
poj3764 The xor-longest Path 字典树与异或
这道题的主要突破点就是从1->n上边权异或上1->m上边权的异或等于m->n上边权的异或。剩下的就是一个经典的字典树求异或最大值了。按道理我该睡了,但是这道题的一个bug被解决了,一定要记录一下。#include#include#includeusing namespace std;const int N = 100000+50;int n, cnt, sz;int原创 2015-10-25 23:14:41 · 425 阅读 · 0 评论 -
二分图匹配入门
之前大一的时候有学姐讲过二分图匹配的匈牙利(Hungrain)算法,当时没理解。最近想补补图论,学习一下二分图匹配的匈牙利算法,其实挺简单的。先弄清二分图匹配时重要的几个概念:(1)交替路:从一个未匹配的顶点出发,依次经过未匹配边,匹配边...,这样由匹配边,非匹配边交替形成的路称为交替路。一定先理解这个概念,才能理解增广路的概念。(2)增广路:从一个未匹配的顶点出发,沿交替路走,到达原创 2015-09-09 20:39:54 · 1130 阅读 · 0 评论 -
poj1204 字典树+DFS
#include#includeconst int N = 1008;const int CAP = 150;char stc[N][N];char word[N];int res[N][3];int dir[8][2]={0, -1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, -1, 0, -1, -1};int ro原创 2015-08-17 15:35:01 · 440 阅读 · 0 评论 -
poj 3630 Phone List(Trie)
这道题通过排序后,对于每个串只需与其前一个串与后一个串做比较来查前缀。我采用的是字典树(Trie), 昨天学的是动态建立的树,导致TLE。 然后学习了一下静态建立字典树。思路:插入串时检查当前插入串是不是之前已插入串的前缀,以及检查已插入串是不是当前插入串的前缀。#include#include#includeusing namespace std;const in原创 2015-08-14 16:46:28 · 451 阅读 · 0 评论 -
hdu 2610
深搜#includeint n, p, len, cnt;bool flag;int num[1024];struct{ int n, pos;}tmp[1024];bool isRepet(int s, int e){ for(int i = s + 1; i if(num[i] == num[原创 2014-08-11 14:45:49 · 520 阅读 · 0 评论 -
poj 1562 深搜
深搜入门了。#include#includeint dir[8][2] = {{0,1},{0,-1},{1,0},{-1,0},{1,-1},{-1,1},{1,1},{-1,-1}};bool isVis[105][105];char oil[105][105];int m, n;void dfs(int x, int y){ isVis[x][y] = t原创 2014-07-31 16:48:50 · 602 阅读 · 0 评论 -
hdu 4462 Scaring the Birds 回溯法
题意:给定一个土地被分成了N*N块,其中有一些空地(最多K块),每块空地都可以选择是否放稻草人,每个稻草人的管辖范围是一个曼哈顿(manhattan)距离,问最少放多少个稻草人能让除空地以外的所有土地都被管辖。学算法分析与设计的时候老师讲过这类问题,但是昨天做模拟赛的时候我把两个语句的位置放反了,不应该= =。这道题的解空间是一棵子集树,而且K最大是10.非常符合用回溯法来解决。原创 2015-10-26 13:50:39 · 429 阅读 · 0 评论 -
poj3259 Wormholes BellmanFord或SPFA
今天学了一下BellmanFord算法(它也是一个求单元最短路的算法),它和不使用优先队列的Dijkstra算法复杂度差不多,但是它可以处理带有负边权的图。算法实现很简单:给定图G=(V, E), |V| = N。 (1)我们对所有边进行N-1次松弛操作可以得到源点到所有点的最短距离。(2)再对所有边进行一次松弛操作,判断是否存在负环,如果存在负环,则从S到所有点的最短距离不存在,否则求解完毕原创 2015-10-25 22:11:21 · 410 阅读 · 0 评论 -
POJ1679 The Unique MST 次小生成树
#include#include#include#includeusing namespace std;const int N = 128;int g[N][N], vis[N], dis[N], pre[N], used[N][N], mmax[N][N];int n, m;struct Node{ int u, len; Node(){}; N原创 2015-08-11 16:55:48 · 320 阅读 · 0 评论 -
hdu 3635 Dragon Balls
题意:起始时每个球都放在原创 2014-08-18 15:13:41 · 526 阅读 · 0 评论 -
AC自动机fail边的理解
如果有一条fail边由1->2,则说明从根到2结点所构成的字符串是 从根到1结点所构成的字符串的后缀。理解这个以后再去模拟一下AC自动机的算法就容易知道AC自动机的原理了。原创 2016-10-19 10:35:32 · 1136 阅读 · 0 评论