搜索
vufw_795
Mood decides everything.
展开
-
sicily 1140(搜索)
题目链接:sicily 1140解题思路:贪心+深搜 相当考编程能力的一道题,一个手贱就卡了好几天,不过的确是一到好题。考察的是对贪心法的运用,还有编程能力——深搜。贪心原则是从最小结点开始搜索(这样最小结点就是根结点),然后对于每一个结点,搜索返回结点数和最小结点,根据题意比较结果,每次贪心搜索之后删除那条边,并标记整个子图,再继续搜索,直到所有的人都分到遗产。代码:(有可能冗余很多,但都是测试原创 2015-04-03 19:48:43 · 692 阅读 · 0 评论 -
Tarjan三大算法之强连通分量
简介: 在之前的两篇博客中,我们详细介绍了Tarjan大牛发明的用来求解割点、桥和双连通分量的算法,这次我们介绍一下强连通分量。算法: 这次的Tarjan算法,可以用一次DFS把所有强连通分量找出来,依旧是用两个时间戳和栈来实现。算法的大体思路还是在深搜过程中更新时间戳,并将遍历过的结点保存在栈中,之后通过对时间戳的判断,来发现强连通分量。当我们完成对一个结点u以及其子孙的访问后,我们可以进行一原创 2016-05-07 22:21:41 · 1878 阅读 · 0 评论 -
Tarjan三大算法之双连通分量(割点,桥)
Robert Endre Tarjan是一个美国计算机学家,他传奇的一生中发明了无数算法,统称为Tarjan算法。其中最著名的有三个,分别用来求解 1) 无向图的双连通分量 2) 有向图的强连通分量 3) 最近公共祖先问题 接下来几篇博客将分别讲述三个算法,首先是无向图的双连通分量,我们先从无向图的割点和桥讲起。下面介绍中无向图中割点和桥的概念: 割点:一个结点称为割点(或者割顶)当原创 2016-04-23 11:25:35 · 11487 阅读 · 4 评论 -
UVALIVE 4452(2-SAT变形)
题目链接:UVALIVE 4452解题思路: 题意大概这样,n个人对m个方案进行投票,每个人最多对m个方案中的4个投票,要么支持,要么反对,问是否存在一个最终决定,能够让每个投票人都有一半以上的建议被采纳。这题的题意有一个比较不清晰的地方,就是什么叫超过一半,其实就是投1个或2个方案的时候,全部建议都被采纳;投3个或4个方案时,最多一个建议没有被采纳。输出要求先判断是否存在满足要求的最终决定,在能原创 2016-05-04 20:10:00 · 838 阅读 · 0 评论 -
UVALIVE 3516(DP)
题目链接:UVALIVE 3516解题思路: 大白书上题目,思路当然是枚举所有情况,实现即记忆化搜索或者动态规划。具体的做法就是枚举根结点最左边的结点,右边的所有结点情况随意,递归调用即可。dp[i][j]表示以S[i]根结点的多叉树的情况代码:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>原创 2016-03-25 23:24:45 · 672 阅读 · 0 评论 -
宽度优先搜索练习(三)
题目链接:wikioi 1099解题思路: 双向广搜,map判重+记录结果(宽搜也可AC)代码:#include <set>#include <map>#include <queue>#include <string>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using name原创 2015-07-13 22:38:14 · 720 阅读 · 0 评论 -
宽度优先搜索练习(一)
题目链接:wikioi 1004解题思路: 宽搜,状态判重用哈希+set代码:#include #include #include #include #include #include #include using namespace std;struct node{ int a[4][4],num,cnt; node(int num=0,int原创 2015-07-13 18:37:15 · 836 阅读 · 0 评论 -
宽度优先搜索练习(二)
题目链接:wikioi 1026解题思路: 宽搜,判重使用大数组(不可使用多组测试数据输入,会WA)代码:#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;bool v[52][52][1005];int n,m,x,y原创 2015-07-13 18:42:26 · 643 阅读 · 0 评论 -
sicily 1071(搜索)
题目链接:sicily 1071解题思路: 题目要求我们把大的矩形分得尽量小,那么当我们把一个矩形分成两部分之后,自然会想到分出来的这两个矩形还能不能继续划分,这样就很自然地想到了递归。确定了大概思路之后,我们就得来解决细节——如何判定矩形能否被划分? 具体来说是这样做的,以寻找x轴方向划分线为例,首先,把矩形按照x轴坐标进行排序,之后遍历每个矩形,如果矩形的右边界的边为划分线,那么左边所有矩形原创 2015-06-15 15:32:08 · 845 阅读 · 0 评论 -
kosaraju算法应用(一)
题目链接:POJ 2186解题思路: kosaraju算法,本以为要缩点,但是题目只要求找到拓扑排序的一个唯一的头,可以水过——通过计算强连通分量的出度。代码:#include <cstdio>#include <vector>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n原创 2015-05-23 15:54:31 · 1009 阅读 · 0 评论 -
CodeForces 339E(搜索)
题目链接:codeforces 339E解题思路: 一上来就像到了搜索,但是被数据量吓到了,不过发现搜索最多三层的时候,我就打算用剪枝来试试看了,关键在于扩展结点太多的结点需要丢掉这一点!代码:原创 2015-06-02 15:00:36 · 1108 阅读 · 0 评论 -
sicily 1214
题目链接:sicily 1214解题思路: 首先我觉得这是一道很好而且比较难的题,难度在于找规律 题目告诉我们,n是一个很大的数(刚好在unsigned的范围内),这样的话,直接模拟是必然超时的,所以,我们需要根据题目的三条公式来推导a[n]。 这个规律我找了很久也没能找到,最后直接拿来用的,怎么想得到的我也不懂。规律如下:如果n的二进制形式满足回文序列的形式,那么a[n]=n。 得到这个规原创 2015-05-27 14:09:46 · 1279 阅读 · 0 评论 -
强连通分量——kosaraju算法
kosaraju算法,三大强连通分量算法之一,最简单、最好理解的求解有向图强连通分量的方法,单纯的两次深搜,就可以划分我们的图。算法流程: 1、从任意一个点开始深搜,得到图的一个最晚完成时间的排序; 2、求图的反图; 3、根据第1步得到的排序,从最晚完成的一个点开始搜索并染色; 4、第三步每一次深搜完成就是一个强连通分量。 下面进行算法的具体分析。算法思想: 其实这个算法是由两原创 2015-05-13 13:26:37 · 2616 阅读 · 0 评论 -
sicily 1219(记忆化搜索)
题目链接:sicily 1214解题思路: 博弈题,用搜索来做。但是,如果用普通的搜索来做的话,是会超时的——复杂度大约是O( n^n ),所以需要采用记忆化搜索的方法(其实差不多就是动态规划了,但是这里是树形DP)。 状态: 用集合S表示现在树的状态,i 表示现在轮到谁进行砍边,dp[ S ][ i ]表示最优值。集合S可以用二进制来表示,即001表示现在还剩下第0条边。 状态转移: 1原创 2015-06-03 18:40:43 · 913 阅读 · 0 评论