Algorithm
小小程序师
我的微信公众号:CodingRush
我的微博:小小程序师 http://weibo.com/2110664035/
展开
-
Tarjan求有向图的强连通分量(Tarjan算法描述)
强连通分量是有向图中的概念,我们先说强连通分量的定义吧:在一个图的子图中,任意两个点相互可达,也就是存在互通的路径,那么这个子图就是强连通分量(或者称为强连通分支)。如果一个有向图的任意两个点相互可达,那么这个图就称为强连通图。 我们常用的求强连通分量的算法有两个,原创 2011-07-12 23:18:30 · 4918 阅读 · 0 评论 -
求解最长回文子串 Manacher算法 之 POJ 3974
对于一个给定字符串的最长公共子串,我们一般的想法都是枚举回文串的中心(假设回文串的长度都是奇数的哈),然后从这个中心逐渐向两边扩展,直到不能扩展为止。显然一开始我也是这么想的,但是明显这样做的时间复杂度是O(N^2)的,所以不用尝试就知道肯定是TLE的。 于是想使用回文串的某些性质,但是没有想到到底应该怎么用,该用哪些性质,所以就百度了一下别人的解法,发现了一个神奇的Manacher原创 2013-03-05 21:33:43 · 5604 阅读 · 1 评论 -
Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
在说Tarjan算法解决桥和边连通分量问题之前我们先来回顾一下Tarjan算法是如何求解强连通分量的。 Tarjan算法在求解强连通分量的时候,通过引入dfs过程中对一个点访问的顺序dfsNum(也就是在访问该点之前已经访问的点的个数)和一个点可以到达的最小的dfsN原创 2011-07-21 11:03:20 · 11295 阅读 · 6 评论 -
逆波兰表达式算法
将一个中序表达式转化成为逆波兰表达式的方法其实很简单,也是一个成型的算法。通过逆波兰表达式求一个计算式子的值,也是很简单的,只要遇到过会用就行了。1、将一个中序表达式转化成为逆波兰表达式。 首先维护的是两个栈,我们这里暂且称为S1和S2,S1中的结果最后存的就是逆波兰表达式,S2中将用于暂时存放运算符并且在最终形成逆波兰表达式的时候,该栈是会清空的。下面我们看看怎样具体的形成逆原创 2012-11-17 01:02:37 · 23032 阅读 · 7 评论 -
组合数学 容斥原理 专题
容斥原理HDU 1796这道题的题意是说给你一个集合,总共有15个元素,每个元素大小小于等于20;问从1至n的数中,能整除集合中任意一个数的总的个数为多少?那么根据容斥原理,我们知道,答案为整除一个元素的数个数之和,减去同时整除两个元素的整数个数之和;加上同时整除三个元素的整数个数之和等等。。。这个枚举直接写一个dfs就行了。可以参考一下我的代码,写的比较简洁。#inc原创 2013-10-13 22:40:49 · 1719 阅读 · 0 评论 -
tarjan 离线求 lca (专题)
离线LCA的求法,相信大家都知道使用tarjan。该方法确实很巧妙,利用dfs的性质,假设u的父亲为fa,当以u为根节点的子树被访问完之后,那么任何与u同属于同一个父亲fa并且不包含在u的子树内的点,与u子树内的任何一个点的最近公共祖先一定是fa,我们使用并查集维护同属一个ancestor的定点集合。HDU 2586 How Far Away?这道题是说给你一棵树,询问任意两点之间原创 2013-10-01 16:48:23 · 1063 阅读 · 0 评论 -
解析KMP算法
字符串匹配的算法当属KMP最为著名了,人人皆知,但是KMP算法是如何做到高效率字符串匹配的呢? 我们首先来看看一般的暴力的字符串匹配算法,对于串s和模式串pattern,依次枚举s中的每一个字符作为起点与pattern尝试进行匹配,直到遇到不匹配的字符的时候,取下一个s中的字符作为起点与模式串pattern重新进行匹配。我们知道这样的时间复杂度是O(n*m)的,显然效率很不好。原创 2013-01-08 22:27:48 · 1704 阅读 · 2 评论 -
关于字符串左移的解法
关于这个问题,已经有很多牛人都讨论过了,而且我的整理也是来自于July大神的这篇博客 http://blog.csdn.net/v_july_v/article/details/6322882 。 我的这篇博客也算是站在巨人的肩膀上吧,不能算盗版吧!写这篇博文有两点原因,一是因为原博文看起来有点繁杂,如果是没有耐心的人估计难以坚持看完。事实上我也是结合自己的想法跳着看完了,没有看代原创 2013-01-03 15:37:24 · 5900 阅读 · 0 评论 -
(算法)二分图的最大匹配(匈牙利算法)
先说下二分图的概念吧:二分图是指图可以分成两个点集X和Y,那么任意一条边两个端点分属于不同的点集,也就是说任意一条边的的一个端点在X中,另外一个端点在Y中。并且同一个点集中的任意点之间是没有边相连的,满足这样的性质的图就是二分图。 匹配是指:在给定的一个二分图G中的一原创 2011-07-13 10:25:46 · 1242 阅读 · 0 评论 -
(算法)Tarjan离线算法解决LCA问题 (附POJ 1470 Closest Common Ancestors 代码)
对于最近公共祖先问题,我们先来看这样一个性质,当两个节点(u,v)的最近公共祖先是x时,那么我们可以确定的说,当进行后序遍历的时候,必然先访问完x的所有子树,然后才会返回到x所在的节点。这个性质就是我们使用Tarjan算法解决最近公共祖先问题的核心思想。 同时我们会想这原创 2011-07-15 22:25:06 · 7764 阅读 · 2 评论