
算法
小狐狸jun
菜鸟飞呀飞~
展开
-
Kruskal Prim Dijkstra
这三个算法每本算法书都要讲到,这次看《算法之道》又复习了一遍,觉得有些新的领悟,写个模板记录一下。 Kruskal和Prim算法解决的问题都是最小生成树问题,即对于一个图G,找到它的最小生成树T,其中E'包含于E,使得所有V都连通。Dijkstra算法解决的是单源多点最短路径问题,即对于一个图G和一个起点S,为图中的其它所有节点找到距离S最近的路径。所说的图都是加权图,如果是均权图或者权重为一的图转载 2012-12-08 16:42:22 · 601 阅读 · 0 评论 -
hdu2430 单调队列
这题用单调队列需要分析好,当然也是自己思维不灵活,老想套用其他题的方法。题意:求出字串和,使其满足sum%p单调队列,自己理解主要在于每次更新操作覆盖掉无用的部分,即根据单调关系那部分在以后的判断都是无用的那一部分,从而使效率提高,而不要盲目的去退队从而将有用的部分去掉使答案错误。这题单调队列pos最小为队头,保证了pos最小即得出的sum[k]-sum[s[top]]最大,然后便原创 2013-06-05 21:55:55 · 729 阅读 · 0 评论 -
hdu2426 二分最优匹配KM算法
这题。。。。很明显的二分匹配。但是要注意没有匹配上的情况。由于学生和宿舍时一一匹配,则需要n同时,在求KM算法中要判断是否能完备匹配,即在找d的时候,判断是否能找到。注意图的初始化为负无穷。代码:#include#include#include#includeusing namespace std;#define CLR(arr, what) memset(原创 2013-06-03 22:06:31 · 611 阅读 · 0 评论 -
hdu3879 网络流(经典最大获利问题)
这题建图自己想了半天搞不懂,然后看了一下别人的建图。。。一脸茫然。。最后去看了下胡波涛的《最小割模型在信息学竞赛的应用》里面详细的讲解了将最大获利问题转换为最小割模型的过程。建图:源点与人连边,容量为获利。站点与汇点连边,容量为耗资。然后是相应的人与其需求的站点连边,容量为无穷。这样建图就完成了,然后就是找最小割,即割边上的值便为不能获取的利润值,用总值减去得出最大利润。原创 2013-06-03 16:50:26 · 1359 阅读 · 0 评论 -
poj 2135最小费用最大流模板
最小费用最大流模板,这是摘抄别人的模板、、、罪恶啊,等省赛后好好搞网络流自己敲。题意给出一个无向图,求1到n点最短环路,要求每个点只能经过一次;思路:即找出图中无交集的两条最短路,建图,源点与1,汇点与n相连,同时附容量为2,其他边则附容量为1。 代码:#include #include #include #include using namespace std原创 2013-05-31 19:44:57 · 583 阅读 · 0 评论 -
poj3264 线段树水题
之前青岛市的一个比赛有题线段树,结果自己实在太二,用线段树去敲没想到自己哪儿错了。。。结果今天回来一做一道求最值的水题就发现自己的错误了。。。。导致那场比赛呗虐啊。。。。 #include#includeusing namespace std;const int inf =1<<30;struct segtree{ int l; int r;原创 2013-05-28 19:56:13 · 1138 阅读 · 0 评论 -
STL ---Map hdu1004,1075,1263
map 的使用 注意first 为key值 second 是value值然后就是在杭电上头文件对于map的map::iterator i;的操作。使用#include会编译错误。。则不会对于hdu1263,由于map存储是按KEY值的字母顺序排序,所以这里免去了排序的步骤。STL很强大!hdu1004:#include#include#includeusing原创 2013-05-28 19:14:58 · 2143 阅读 · 0 评论 -
hdu4417(树状数组)(线段树)(划分树+二分)
这题主要用来练习一下划分树和线段树;线段树也可以做,但是划分树+二分思路更清晰。划分树用来求logn时间的区间中第k大值,其中如果有相同大的值也不会覆盖,如区间内有2个5,则一个5为第n大,另一个5为第n+1大;还是3种方法代码都敲出来吧,其中线段树和树状数组的思路是相同的,就是先对查询和原数组进行排序,然后利用树状数组和线段树通过判断赋值后快速求区间内的值。这里线段树最后开大小时原创 2013-05-24 21:33:12 · 889 阅读 · 0 评论 -
poj2777线段树+lazy思想
题意:有一个长板子,多次操作,有两种操作,第一种是给从a到b那段染一种颜色c,另一种是询问a到b有多少种不同的颜色。 这题更加让我理解线段树的结构了,特别是lazy思想的运用。事实上lazy思想就是个懒人的标记,若对于这个结点lazy标记为true,就代表不需要继续查找缩小的区间了。主要是在更新结点的地方,若填充整个区间时,标记lazy,则在下次其他的更新操作时,若结点为ture,原创 2013-05-21 22:34:59 · 1077 阅读 · 0 评论 -
hdu1166线段树水题
线段树很有用噢!多练练,lazy思想是什么呢,下一题学一下。题意:对一个数组进行更改,和查询区间之和. #include#includeusing namespace std;struct segtree{ int l; int r; int mid; int max; int sum;}T[600011];原创 2013-05-21 21:12:39 · 596 阅读 · 0 评论 -
hdu1242优先队列BFS
题意,给出n*m矩阵,求从r到a的最小步长,其中遇到x两步,' . '为通路' #'为墙。这题可以直接BFS,我这里第一次用优先队列做,使用STL有风险,一般做小规模模拟题可以,但是STL事实上其操作更繁琐,只是用起来方便而已。 优先队列:priority_queue 这里用一个结构体来作为容器,在其中加上比较符重载,实现使队头保持最小步长。若直接用则是值越大优先权越大。原创 2013-05-21 20:00:46 · 527 阅读 · 0 评论 -
二进制算法
首先是6个二进制的运算符:运算符 含义 描述& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍原创 2012-12-19 17:37:55 · 4282 阅读 · 0 评论 -
hdu 1542线段树(成段更新+离散化)
第一次做线段成段更新的题,这题需要离散化。题意:给出几个矩形,求其覆盖面积。思路:先离散化x坐标,然后加入矩形的上下边,对矩形上下边根据高度进行排序后。建树,从最高的边开始更新线段树,然后就是通过给每条边赋值上边-1下边1,通过节点中iosum来判断每次线段树中的有效边,每次ans+=有效边*下一层边的高度,最后得出答案。代码:#include #include #incl原创 2013-06-06 21:42:04 · 593 阅读 · 0 评论