算法
night0508
这个作者很懒,什么都没留下…
展开
-
Kruskal&Prim
Kruskal算法是计算最小生成树的。将边的权值按从小到大的顺序排列,每次从最小的边开始,若边的两个端点未在同一个连通分量中,则可使用这条边。那么如何确定他们是否在同一个连通分量中呢?用并查集。Kruskal算法是以边为基础,适合于稀疏图;而Prim算法适用于稠密图。附Kruskal算法代码如下:#include#includeusing namespace std;struc原创 2016-07-28 20:13:17 · 355 阅读 · 0 评论 -
Tarjin算法
Tarjin算法一种用于寻找强连通图的算法。每当搜索到一个点时,就将其入栈,用dfn[]数组记录搜索到该点的时间,用low[]数组记录该点所在的强连通图所在搜索子树的根节点的dfn值具体操作:1、首次搜索到某个点时,将其dfn与low值初始化,定义为发现此点时的时间,并将其入栈2、当发现一个点与其相连时,判断此点是否在栈内,若在,则原点的low值等于其与被发现点dfn值的最小值;若原创 2016-07-31 21:56:39 · 2226 阅读 · 0 评论 -
线段树—区间合并
线段树的区间合并,即寻找询问区间中满足条件的连续最长区间。而一个区间连续的最长区间有两种情况:1、此连续最长区间全在左子树或全在右子树,则sum[t]=max(sum[t2、一部分在左子树,一部分在右子树,则sum[t]=suml[t因此,我们需要记录每个区间的最长连续区间,从左边第一个孩子开始的最长连续区间,从右边第一个孩子开始的最长连续区间附鄙人代码如下:(并不能确定此代码原创 2016-08-04 21:24:50 · 2846 阅读 · 0 评论 -
树状数组
方格中数字代表对应数组的第几个元素,下排是a数组,其上方的是e数组,最下的二进制则是对应编号的二进制表示.箭头表示这个数组元素被哪个数组元素包含了,比如e[2]=e[1]+a[2]=a[1]+a[2], e[4]=e[2]+a[3]+a[4]=a[1]+a[2]+a[3]+a[4].注意观察:1.每个元素至多仅被一个元素包含,这点和树有很大相同,但整体并不是树2.每个ei可认为是仅原创 2016-08-04 22:02:54 · 223 阅读 · 0 评论 -
线段树
线段树是一种二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。而每次查找与替换都可以控制在O(logN)的级别。以下为鄙人Hdu1166代码,可以进行区间求和,单个区间加或减一个数:#includechar a[1000];int childl[10000]={0},childr[10000]={0},sum[10000]={0};void build原创 2016-08-01 21:49:19 · 260 阅读 · 0 评论