- 博客(32)
- 资源 (1)
- 收藏
- 关注
原创 Fibonacci Heap
<br />经过一下午的debug,总写出能运行的Fibonacci Heap了~<br /> <br />测试表明,运行的常数没有想象中的大。<br />和dijkstra配合的也不错,中小数据和二项堆表现几乎持平。<br />有待进一步大数据测试<br /> <br /> <br />#ifndef __FIB_HEAP__#define __FIB_HEAP__#include"PQ.h"template<class T>class fib_heap : public PQ<T>{
2010-09-18 21:39:00
2082
原创 Binomial Heap
最近在比较Dijkstra+各种优先队列组合的效率。这个想法源于算法课的作业。作业要我们用现成的库(LEDA)来比较。我比较出来的结果和预期相差甚远,怀疑是不是库的问题。于是,这次我亲手写了所有的代码,再比较一次。Binomial Heap虽然经常被各种教科书提到,不过实际应用不是很多。理由很简单:他没有堆简单,也没有斐波那契堆高效。然而,优美的结构(虽然不是很容易实现,可能是
2010-09-18 13:40:00
2300
4
原创 最优二叉搜索树
给出一个数组,每个数字有一个出现平率。构造最优二叉搜索树,使得sum{元素的深度*元素的频率}(叫做二叉搜索树的权)最小。本来是个经典O(n^3)的DP:先把元素按照数组数字排序f[i][j]=min(f[i][k-1]+f[k+1][j])+freq[i]+freq[i+1]+。。。+freq[j],ifreq[i]是第i个元素的频率。不过存在一个神奇的O(n^2)做法,利用
2010-05-25 16:34:00
726
原创 sliding window问题
sliding window问题是一个经典问题。给出一个长为n的数组,求每个长度为k的子区间的最小值。比如:n=5序列为: 5,2,8,6,4,7k=3那么按照从左到右的顺序,所有长度为3的子区间的最小值分别是:2,4,7最简单的解法需要O(n*k)的复杂度。通过维护window的“上升最小序列”可以在O(n)的时间内对于某一个k求出所有答案 一个序列W
2010-05-24 15:07:00
2503
原创 USACO 2.3 concom
这题观察到有递推关系,以为是DP,不过担心递推会推出环来,产生后效性,于是就用了类似bellman-ford的想法,不断刷新,知道没有更新发生为止。更新的次数有限,所以算法一定会终止。
2010-05-17 18:05:00
536
原创 USACO 2.3 nocows
这题是比较明显的用动态规划计数的问题,不过状态转移方程不是很简单(或许是我没想到简单的)。用n(结点数)和k(高度)表示状态。f[n,k]=2*sum{f[n-1-i,k-1]*g[i,k-1]} - sum{f[n-1-i,k-1]*f[i,k-1]} for all 0n=1,k=1是边界情况。这个关系式的依据是:由于左右子树都不为空,于是左子树或者右子树高度为k
2010-05-17 13:17:00
562
原创 C++ exception implementation
#include #include #include #include struct env{ jmp_buf x; //jmp_buf seems to be an array};env* make_env(){ env* res=(env*)malloc(sizeof(env)) ; return res; }
2009-10-30 16:59:00
598
原创 pku3469
这是道数据巨大的网络流的题目,但模型貌似不那么明显(或者是我太水了。。)题目意思是:有一些模块(modules)和一个双核处理器,一个模块可以在任意一个核上处理,每个核对应每个模块有个开销。现在有一些模块间需要数据交换,如果需要数据交换的模块在一个核上处理,则不需要额外开销,否则需要加上一个开销。现在需要完成所有模块,问最小需要多少开销。如果没有这个额外的开销,那么每个模块只要选择开销
2009-05-26 20:43:00
1446
1
原创 NOI2006最大获利 网络流模型备忘
最大获利题目来源:NOI2006【问题描述】 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。THU 集团旗下的CS&T 通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究、站址勘测、最优化等项目。在前期市场调查和站址勘测之后,公司得到了一共N 个可以作为通讯信
2009-05-26 17:54:00
1881
2
原创 递归转化为非递归的一般方法
递归的本质是通过栈来保存状态,然后再次调用自己进入新的状态,然后函数返回的时候回到上次保存的状态。尾递归可以直接转化成循环,这里不多做分析更一般的递归,想要转化为非递归,就需要模拟栈的行为。 首先需要自己建个栈。栈保存的东西是一个记录,包括所有局部变量的值,执行到的代码位置。首先讲局部变量初始化位一开始的状态,然后进入一个循环执行代码时,遇到递归,就制作状态压栈保存,然后更
2009-05-07 01:23:00
20993
2
原创 关于dijkstra+heap的实现
大家说道dijkstra就不得不提它的heap优化。但是具体怎么实现呢? C++ STL提供了priority_queue, 支持push,top,pop操作。但是光靠这三个函数还不足以实现dijkstra的优化。回想dijkstra算法中,for(1..v)的大循环内,每次在unknown的集合中找到dist[]数组里最小的那个,从unknown集合中删除该结点。朴素实现需要O(V)
2009-04-17 18:56:00
3524
原创 heap+dijkstra与SPFA的对比
heap+dijkstra与SPFA都是单源最短路的高效算法,到底谁比较快一直各有各的说法。于是心血来潮自己测试了下。测试工具:cena 0.6系统: windows vistaCPU: T2130, 1.86Ghz 所有程序中,图用相同格式存储,输入,输出,数据都是静态分配邻接表参考dd的dinic代码Dijkstra1: 我写的的支持内部修改的heap,
2009-04-17 17:04:00
7149
5
原创 点集最短欧几里德距离
这个是经典的分治算法,大多数书上都有描述。我却很少找到完整的代码,于是自己写了一个 整体是把归并排序的框架做了修改,复杂度是的O(n*logn),经测试100万个点5秒左右能出结果不过有个奇怪的地方一直不明白……我用java写了一样的代码,运行速度和c++居然差不多(貌似还略快),100万个点也是5秒左右……感觉是这个c++的代码还不够完善…… #include#i
2009-04-03 18:02:00
1734
1
原创 USACO gifts1
文件输入输出问题搞定之后顺便再做个简单题,第一次尝试API里的hash table,貌似蛮方便的 import java.io.*;import java.util.*;import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;public class gift1 { public static
2009-02-26 01:16:00
600
原创 USACO ride
usaco过了,还是意犹未尽可能是不少题看答案的,甚至交标程过的,不太安心不过做了确实有些长进。我现在再看我以前写的代码就能感觉到了 java这东西感觉像匹烈马……真不容易搞……光弄个文件输入输出就研究半天,花了1小时没弄明白为啥输出文件里啥都没有……结果是没有out.close();总之对java太不熟练…… import java.io.*;import
2009-02-26 01:10:00
594
原创 USACO vans
USACO 在参考了网上的众多资料之后终于给我搞掉了!~ 这道题能做出来完全归功于 新野 的http://sinya.yo2.cn/postal-vans的详尽的解题报告这个解题报告写的是我读过的最详细最易懂也是最好的报告/*ID: biran001PROG: vansLANG: C++*/#include#include#define FOR(
2009-02-21 00:20:00
654
原创 USACO rectbarn
第六章干掉第二题了— —+虽然是看过答案之后才干掉的……详细参见03年王知昆论文, 那个O(mn)的算法能过 由于点太多了,O(S^2)的会超时 /*ID: biran001PROG: rectbarnLANG: C++*/#include#include#define FOR(i,s,e) for(int i=s;i<e;i++)#defi
2009-02-20 18:27:00
640
原创 USACO COWXOR
终于把这题过掉了!~之前一直看不懂网上的解答,而且找了半天没找到什么好懂的解法。。昨天上网的时候看到有人说自己用trie把这题过掉了于是上网学习trie这个东西trie是字典树,每个结点有26个孩子,分别对应26个字母。根到叶对应一个单词,节点上可以记录数据,搜索字符串的复杂度位O(n),n是字符串长度照着网上的样例code写了编,发现蛮简单的然后回过头看这题有一行
2009-02-19 19:43:00
2693
原创 UVA 10330
之前都不知道结点带容量的最大流怎么求,今天看了篇国家队论文受到启发,原来把一个点拆成两个点,一个接输入的边,一个接输出的边,两点之间的容量是节点的容量,这样问题貌似就等效了因为如果一个流存在于原来网络,那么也一定存在于这个新网络。相反,新网络里的任意的流,都可以对应到原来的网络里面 #include #include#include#define INF 0x1111111
2009-02-14 14:45:00
934
原创 uva 820
自己写的第一个网络流,用bfs找最短路 输入的时候两个点之间可以有多条边,权值相加就行了 #include#include#include#define FOR(i,s,e) for(int i=s;i<e;i++)using namespace std;int s,d,n,c,ans;int g[100][100];int bfs(){
2009-02-14 11:55:00
1293
原创 UVA 10525
过了这道AC率较低的题,得意下— —这题是最短路径问题,但是比较的是最短时间,时间相同的时候再比较最短路径用bellman-ford带上改过的relax函数就可以了,但是这样还不够论坛上看到帖子说可能一条路被报告2次,应该选择路程(时间)较小的值之后就AC了估计不少人是栽在这个问题上 #include#includeint dis[60][60],tm[6
2009-02-14 00:39:00
494
原创 UVA 193
最大独立集,NP完全问题,考暴力搜索,不用优化就能过输出间没有空行 #include#include#define BLACK 1#define WHITE 0#define UNDEFINED -1bool g[100][100];int n,m,ans,rec[100],count;char color[100];void search(
2009-02-13 20:05:00
600
原创 UVA1008
这题一直以为是贪心。 每次宿便选一条砍树最多的方向,怎么砍都不会亏吧……试了大量随即数据,都没找到反例,但是交上去就是WA,百思不得其解 之后上网搜,居然真的找到了反例—— .012...3.4...567..8.........9A Optimal solution has 4 lines: 0-7-A, 2-5-8, 3-6-9, 1-4. Your algorit
2009-02-09 18:19:00
554
原创 UVA 11013
这时道模拟题做这种题目不能慌,不用急着找最优的实现方法,写出能解决问题的代码是首要问题,优化可以之后慢慢来。其实这种题目一般不是比速度……我完全没做优化的模拟也就用了0.03秒就过了 #includechar change_card[3],value[5],suit[5],rem_cards[13];bool stay;void input(char *s){
2009-02-09 16:09:00
536
原创 UVA 10702
这道题是考 bellman-ford 的变形。变化1:要求的是最长路径,不是最短路径解决方法: 可以把所有的边改成负数,然后求最短路,之后再改回来。或者直接改relax的比较函数也是可以的变化2:不是求最短路,而是经过T个边的最短路。解决方法: bellman-ford中,通过不断松弛所有的边来实现最短路。第n次松弛可以保证图中所有最短路径小于n的结点全部找到, 但是不能保证第n次
2009-02-07 20:59:00
700
原创 UVA 10051
这题是dp,状态为:第 i 个盒子为顶, 第 s 个面朝上, 对应的可能的最大高度,记作F[i,s]F[i][s]=1+max{0,F[j,k]}, 期中J>i,且color[i][oppo[s]]=color[j][k]更新的时候用数组path[i][j][2]记录下一个箱子的标号,朝上的面,用来输出。以前写这些元素带属性的题目老喜欢用结构体,后来看书上伪代码完里全用数组表示,于是也
2009-02-07 17:32:00
994
原创 UVA166
这题是背包模型的dp的变形。硬币的类型已至,自己有的各种硬币数量已知,要付的钱已知,假设老板拥有所有种类硬币无限多,问你要付那么多钱最少要交换的硬币数是多少(我付的钱加老板找的钱)首先我的硬币数目有限,用多重背包找到每种价格的最少付的硬币数老板硬币无限,用完全背包算出所有他能找的钱的最少硬币数然后从商品价格开始往上试,定一个上界,看各种付钱找钱方法最少的交换硬币数,最少的一个就是答
2009-02-07 16:24:00
1186
原创 UVA 357
经典dp,但是怎么写都超时……找到别人AC代码,发现填表只要一次就行了……以后答案直接查表居然这么囧…… #includeint coin[5]={1,5,10,25,50};long long ans;long long f[32001];long long complete(int bound){ f[0]=1; for(int k=0
2009-02-07 15:39:00
1048
原创 UVA 10003
这两天状态太囧了……看啥啥不会,做啥啥WA……这题就纠结了我好几小时 题目是经典DP,和矩阵相乘的最小乘法次数那个是一样的 f[i,j]=min{f[i,k]+f[k,j]}+j-i (k是i,j之间的木棍切割点) f[0,L]就是答案。由于划分阶段貌似比较困难,于是毫不犹豫的使用记忆化搜索开始的时候f数组开了1000*1000(由于L最大为1000),然后转移状
2009-02-06 00:34:00
2564
Support Vector Machines Applied to Handwritten Numerals Recognition
2009-11-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人