做题总结
bokzmm
这个作者很懒,什么都没留下…
展开
-
克鲁斯卡尔求最小生成树
一、知识点回顾(1)树:由 n 个结点,通过 n - 1条边相连且未构成回路的集合; (2)生成树:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一颗树。(生成树不唯一)(3)最小生成树:如果边上有权值,那么使得权值和最小的生成树叫做最小生成树。二、克鲁斯卡尔(1)克鲁斯卡尔思想:按照边的权值的顺序从小到大查看一遍,如果不产生环(重边也算在内),就把当前这条原创 2015-08-11 23:21:05 · 702 阅读 · 0 评论 -
二分图匹配知识
二部图及其最大匹配:二部图:对于无向图G(V,E),若能将其顶点分成V1,V2两个不相交的非空子集,使得G中的任何一条边的两个端点一个属于V1,另一个属于V2,那么该图就称为二部图。性质:一个无向图G(V,E)是二部图当且仅当G中不存在长度为奇数的回路。匹配:在图论中,一个「匹配」(matching)是一个边的集合,其中任意两条边都没有公共顶点。例如,图 3、图 4 中红色的边就是图原创 2016-04-28 21:06:20 · 4111 阅读 · 0 评论 -
如何求一个数的二进制表示中1的个数
求一个数的二进制中1的个数方法很多,在这里我总结最近学到的两种简单好用的方法:(1)简单法:由于右移运算符的特性,每向右移动一位,相当于二进制的最低位就被消除高位补零,其功能相当于该数每次除以2。利用上述原理,每次让二进制的最低位和1进行与运算.若该位是1,则记一次数.然后右移1位;继续上述运算,直到为零。代码实现:int count (int n ){原创 2016-04-12 17:14:59 · 1058 阅读 · 0 评论 -
C++STL优先队列小结
在C++的标准库中优先队列默认优先级是参数值大的优先级高(1)一般定义:priority_queue 优先队列名;当然有些时候我们需要优先级是从小到大的(2)自定义优先级1、priority_queue数据类型 ,vector数据类型>, greater数据类型> > 优先队列名;这里再定义时传入了一个函数greater2、struct node {原创 2016-04-04 17:28:35 · 368 阅读 · 0 评论 -
求大组合数模板
从n个数中选出m个的方案数称为n的m的组合数,下面是可以求出long long 范围内的组合数模板。主要思想就是利用double 求出近似的数值,最后约分。long long fun(double n,double m){ double s=1.0; while(m>0) { s*=(n--)/(m--); } s+=0.5; //防止有精度原创 2016-03-15 18:10:33 · 559 阅读 · 0 评论 -
切西瓜
一个西瓜切N刀,问最多能将其切多少块?其实就是空间划分问题;(1)首先,让我们先看一下一维下的情况(N个点最多能将直线分成多少块);一个直线切N次,N=1时,直线最多被分为两块,N=2时,最多被分为三块;N=3时,最多被分为4块,依次类推,当切N次时,最多被分为N+1块;递推证明:一个点最多能将一个直线分成两部分,所以有 a[n] - a[n-1] = 1;且a[1] =原创 2015-09-18 22:00:10 · 930 阅读 · 0 评论 -
SPFA(最短路问题)
简单的说,spfa就是通过队列·来实现的求最短路径的算法;首先,要用到一个邻接表来存储各顶点之间的关系(包括起点u,终点v,以及u,v之间的权值w)。然后就是构造spfa函数;第一步:对dis[ ]( 用来存从源点到各顶点的最短距离 )初始化为 INF(一个很大的数例如0x3f3f3f3f), 对 vis[ ]数组初始化为零(表示未有点入队列);构造一个队列 queueQ;并将源点原创 2015-08-20 11:15:22 · 432 阅读 · 0 评论 -
矩阵快速幂
本文转自http://www.cnblogs.com/yan-boy/archive/2012/11/29/2795294.html矩阵 快速幂矩阵的快速幂是用来高效地计算矩阵的高次方的。将朴素的o(n)的时间复杂度,降到log(n)。这里先对原理(主要运用了矩阵乘法的结合律)做下简单形象的介绍:一般一个矩阵的n次方,我们会通过连乘n-1次来得到它的转载 2015-09-09 23:08:49 · 320 阅读 · 0 评论 -
求最长公共子序列——LCS
LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置.下面是字符串21232523311324和字符串312123223445的匹配矩阵,前者为X方向的,后者为Y方向的。不难找到,红色部分是最长的匹配子串。通过查找位置我们得到最长的匹配转载 2015-08-06 09:30:11 · 333 阅读 · 0 评论 -
栈的应用之进制转换
进制转换:十进制转化为K进制:除k取余法1. 十进制整数转换为K进制整数十进制整数转换为 K 进制整数采用"除2取余,逆序排列"法。具体做法是:用十进制整数除以k,可以得到一个商和余数;再用商继续除以 k ,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为K进制数的低位有效位,后得到的余数作为K进制数的高位有效位,依次排列起来。例如,十进制整数转原创 2015-08-18 16:33:15 · 1414 阅读 · 0 评论 -
迪杰斯特拉(最短路径)
最短路径:在一个图中,如果从一顶点到另一顶点存在着路径,那么定义路径长度为一条路径上所经过的边的数目,那么这个图中从一顶点到另一顶点的所有路径中路径长度最短的叫做最短路径;在一个带权图中,权路径长度最小的叫做最短路径,其带权路径长度叫做最短路径长度(迪杰斯特拉主要求带权图的最短长度)迪杰斯特拉的算法思想:对于有向带权图中从一确定顶点到其余各点的最短路径问题:首先,设置两个顶点集合S和T原创 2015-08-17 23:25:52 · 1017 阅读 · 0 评论 -
高效素数打表
一牵扯到素数,大部分都要打表,一是打表方便,二就是省时;下面介绍一种素数打表方法;假如在1~1000000内打表;int ans[1000010];void is_prime( ){ int i,j; ans[0]=ans[1]=1; for(i=2;i { if(!ans[i])原创 2015-08-28 23:22:35 · 338 阅读 · 0 评论 -
普利姆-求最小生成树
一、普利姆算法的基本思想: 从连通网络 N = { V, E }中的某一顶点 u0 出发, 选择与它关联的具有最小权值的边 ( u0, v ), 将其顶点加入到生成树顶点集合U中。 以后每一步存一个顶点在 U 中,而另一个顶点不在 U 中的各条边中选择权值最小的边(u, v), 把它的顶点加入到集合 U 中。如此继续下去, 直到网络中的所有顶点都加入到生成树顶点集合 U 中为止。采原创 2015-08-13 11:35:27 · 619 阅读 · 0 评论 -
kmp算法(字符串匹配)
(1)kmp算法的用途:KMP算法是用来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。例如”Today is Tuesday”.中是否包含”day”,在哪些位置包含。(2)kmp算法的概述:假如,A="abababaababacb",B="ababacb",我们来看看KMP是怎么工作的。我们用两个指针i和j分别表示,A[i-j+ 1.原创 2015-08-10 08:49:38 · 439 阅读 · 0 评论 -
LCS算法的概述及由来(LCS)最长公共子序列
第一节、问题描述 什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。 举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。 注意最长公共子串(Longest CommonSubst转载 2015-08-10 17:29:15 · 1047 阅读 · 1 评论 -
用vector实现邻接表的建图
一、vector 简介及基本操作:1、vector是c++中stl库中封装好的容器,常用定义不定长数组来构建无向图或有向图.2、基本操作:(1)头文件#include.(2)创建vector对象,vector vec;(3)尾部插入数字:vec.push_back(a);(4)使用下标访问元素,cout(5)使用迭代器访问元素.vector::ite原创 2016-04-18 19:42:57 · 7219 阅读 · 1 评论