03 2014 档案
<原创>MST-Prim算法实践——POJ 1789<240K内存 349MS AC>
摘要:一、Prim算法算法描述:算法过程与Dijskstra算法基本一致,只有一点不同,就是Dijskstra执行Relax操作的地方,使用相应的边的权重来更新相应点的D值。参考《算法导论》23章最小生成树Prim算法部分二、问题描述POJ1789:http://poj.org/problem?id=1789卡车的牌照标识一般是从一种牌照演化到另一种,现在历史学家要研究牌照演化的进程,给定一组卡车牌照,写个程序帮历史学家找出牌照演化的最小生成树。四、问题分析编程之前需要解决一个问题:问题一、图的构造?问题一:这道题目图的构造还是不算难的!以每种卡车牌照为节点,任意一种牌照到其他牌照都有边,边的权重,
阅读全文
<原创>Kruskal算法实践——POJ 1789<这题使用Prim更加快且省内存,参见我的另一篇博文>
摘要:一、说明POJ1789这道题目看完题意之后,因为每个顶点到其他所有顶点都有边,所以这个问题显然是个稠密图,对于稠密图显然Prim更快,而且,如果细细分析之后,会发现Prim不仅仅是比Kruskal快哟,关键是省去了巨大内存空间。关于这个道题用Prim并且考虑内存节省的题解,参见我的博文: http://www.cnblogs.com/Oloo/articles/3631631.html二、Kruskal算法算法描述:将边按照升序排序,然后按照这个顺序依次取边,判断符不符合加入条件,如果符合,则把这条边的两个顶点合并成一个set,不符的话,取下一条边,重复上述过程。上面描述中的判断条件是,两个.
阅读全文
<原创>Floyd-Warshall算法实践——POJ_1125
摘要:一、Floyd-Warshall算法我第一次接触这个算法是通过《算法导论》,感觉这里写的还是很好的!不愧是MIT《算法导论》在介绍这个算法之前,写了一个小引子——利用矩阵乘法的思想解决每对顶点间的最短路问题,通过对比这个引子和Floyd-Warshall算法,就会发现有时候自然的规律就是这么简单,和我们普通人稍微动一下脑袋得出的结论其实就差了那么一点儿!1、引子部分的思想一句话概括要求i到j的最短路V(i,j),可以看成是求所有的i到j经过N-1条边的路径中最短那一条。那么我们如何求解i到j经过k条边的最短路呢?分为两种情况,第一种,i到j经过k条边的最短路等于i到j经过k-1条边的最短路。V
阅读全文
<原创>Dijskstra算法应用二——POJ 2253
摘要:一、Dijskstra算法参考我之前一篇博文:http://www.cnblogs.com/Oloo/articles/3614810.html或者《算法导论》第24章单源最短路Dijskstra算法部分二、问题描述POJ2253:http://poj.org/problem?id=2253一共有两只青蛙,分别位于湖中两块不同的石头上,一只青蛙想要跳到另一只青蛙那里,通过湖中的石头。现在给出湖中石头的坐标,要求青蛙至少每次能跳多远,才能顺利到达另一只青蛙那里。三、问题分析编程之前需要解决三个问题:问题一、图的构造?问题二、单源最短路or每对顶点间最短路/BellmanFordorDijskst
阅读全文
<原创>BellmanFord算法实践二——POJ 3259
摘要:一、BellmanFord算法参考我之前一篇博文:http://www.cnblogs.com/Oloo/articles/3612366.html或者《算法导论》第24章单源最短路bellmanford部分二、问题描述POJ3259:http://poj.org/problem?id=3259有F个农庄。对于每个农庄有N块田,有M条路分别连接两块田,这M条路是双向的,有W个虫洞,每个虫洞连接两块田,但是是单向的。对于每个农场判断,存不存在一个点,从该点出发,经过虫洞和一系列路径可以回到该点,看到以前的出发时候的自己。三、问题分析编程之前需要解决两个问题:问题一、图的构造问题二、目标转换问题一
阅读全文
<原创>Dijskstra算法应用——POJ 1062
摘要:一、Dijskstra算法首先Dijskstra算法和bellmanFord算法相比多了一个要求:边的权值为非负。Dijskstra算法其实是一种贪心算法,一般地,贪心算法不能保证找到全局最优点。但是Dijskstra正是充分利用了边的权值非负这一点,进而保证所求结果是全局最优的。关于Dijskstra的正确性证明,可以参见《算法导论》24章单源最短路一章关于Dijskstra的部分,正确性证明看起来还是挺顺的~二、问题描述POJ1062:http://poj.org/problem?id=1062因为是少见的中文题,所以题意就略了。三、问题分析编程之前需要解决两个问题:问题一、图的构造问题二
阅读全文
<原创>BellmanFord算法实践——POJ 1860和POJ 2240
摘要:一、BellmanFord算法 由n个点组成图,从一点v0到一点vn的最短路p,p最多由n-1条边组成。 现在有一定理: 设P={(v0,v1),(v1,v2),.....,(vn-1,vn)}为v0到vn的最短路,其中(vi,vj)表示从vi到vj的边,如果,我们能够保证按照P中的这些边的排列顺序来对每个边进行Relax操作,那么由此计算出的D[vn]即为v0到vn的最短路的长度。 bellmanFord算法,就是以上面这个定理为基础。bellmanFord通过对每条边Relax n-1次来保证上面定理的条件,进而得到v0到vn的最短路的长...
阅读全文
<原创>拓扑排序应用——POJ_1094
摘要:一、问题描述 POJ_1094:http://poj.org/problem?id=1094 输入: 给定字母个数n(从A开始计数),给定偏序关系个数 下面是一系列偏序关系 输出: 分为3种 1、在第i个关系之后,找到唯一的拓扑排序序列 2、拓扑排序不唯一 3、在第i个关系之后,发现圈 二、需要解决的问题 问题有3个: 第一个问题:怎么确定加入第i个关系出现回路? 解决办法之一:首先,判断一个图是不是有回路的方法是,把DFS稍加修改,在从...
阅读全文
<原创>回溯法应用——ZOJ1003
摘要:一、问题描述 ZOJ 1003:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1003 标号为1~100的100个气球,两个人来踩气球,每个人初始分数为1,没踩破一个气球,则乘以该气球的数字。最后,两个人报出自己的分数。低分者要质疑高分者的分数,如果证实高分者的分数和低分者的分数矛盾,则低分者赢,否则高分者赢。 矛盾的意思就是两者分数不能仅使用1~100内的不同的数字作为因子乘出。 二、解题思路 使用回溯法。从100开始,尝试来先分解较小的数,直到分解完成或者分解失...
阅读全文
<原创>回溯法应用——ZOJ1002
摘要:一、问题描述 题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002 n*n的地图,'.'表示空地,'X'表示墙,现在往地图上放置炮塔,要求两两炮塔不能同行同列(除非之间有墙),给定一种地图,问这个地图最多可以放置多少个炮塔? 二、与八皇后问题进行比较 与八皇后不同的时,八皇后问题每行放一个皇后,且最多放一个。而该问题,每行可以放多个炮塔,取决于墙的位置。 不过,除了上面的不同点之外,这个问题与八皇后十分像。 八皇后问题中,我采用逐行扫描,逐...
阅读全文
<原创>回溯法应用——八皇后问题
摘要:一、问题描述 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 二、回溯法一句话概括 从一条路往前走,能进则进,不能进则退回来,换一条路再试。 三、八皇后问题分析 首先注意到每一行都要放置一个皇后,所以数据表示可以使用一个数组S,S[i]表示第i行第S[i]列放置了皇后。 回溯的前进条件:在i行,找到一个位置可以放置皇后,则开始为第i+1行找寻可以放置皇后的位置。 返回的情形:1、进行到第i行,但没有找到可以放置皇后的位置,那么跳回第i-1行,修改该行的皇后位置...
阅读全文
浙公网安备 33010602011771号