
搜索——深度优先搜索(DFS)
文章平均质量分 81
XDU_Skyline
Everything is over, everything is just beginning.
展开
-
例题6-8 树 UVa548
1.题目描述:点击打开链接2.解题思路:本题给出了一颗二叉树的中序遍历和后序遍历,要求找一个叶子,使得它到达根结点的权和最小,如果有多解,那么该叶子自身的权应该尽量小。首先,根据中序遍历和后序遍历建立二叉树,这道题采用数组来存放左右子树的结点值,根为root的左子树结点为lch[root]右子树结点为rch[root]。那么,如何根据中序遍历,后序遍历来建树呢?方法是根据后序遍历找到根,然原创 2015-03-30 00:12:08 · 510 阅读 · 0 评论 -
HDU 5046 Airport (2014年上海赛区网络赛E题)
1.题目描述:点击打开链接2.解题思路:本题利用二分+DLX(重复覆盖型)解决。首先,看到最大值最小化,肯定是用二分法解决。但是没有想到的是这题是重复覆盖的模板题==(见识短浅了。。一直在想dfs)。在DLX算法中,关键要明确行和列分别如何确定。显然,这里的行是可能当做机场的城市,列是与该城市距离小于给定的M的城市。这样就可以利用DLX算法了,同时,这道题还可以加上一个剪枝,如果发现剩下的未被原创 2015-09-08 22:09:22 · 736 阅读 · 0 评论 -
POJ 3050 Hopscotch
1.题目描述:点击打开链接2.解题思路:本题利用DFS解决。对每一个格子都进行dfs,当cur==6时,将合成的整数放入set中,最后输出set的大小即可。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#include#include#include#include#inclu原创 2015-04-08 15:40:08 · 528 阅读 · 0 评论 -
HDU 4435 charge-station (2012年天津赛区现场赛E题)
1.题目描述:点击打开链接2.解题思路:本题利用DFS解决。不过本题的解法颇为巧妙,注意到2^0+2^1+...+2^(i-1)3.代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include原创 2015-08-27 21:10:40 · 720 阅读 · 0 评论 -
习题10-23 Hendrie序列 UVa10479
1.题目描述:点击打开链接2.解题思路:本题是一道找规律题,仔细观察后发现有以下特点:(1)下标为2^k的数正好为k(下标从1开始)。(2)如果依次以1,2,4,8...的长度来分解串,可以将序列分解为:0 1 02 1003 02110004 1003020211100005......可以发现,第i个串是由第i-2,i-3,...2,1,0个串组成的。且第i-2个串有1个,第i-3原创 2015-05-02 13:58:52 · 839 阅读 · 0 评论 -
习题7-4 切断圆环链 UVa818
1.题目描述:点击打开链接2.解题思路:本题利用枚举集合的方法解决。本题要求找出最少的需要切断的圆环个数,使得重新连接后,所有的圆环可以形成一条链。本想着只用统计度数即可解决了,不过最后发现是我想的太简单了。最后实在想不出好的方法了才参考了别人的解法,果然相当巧妙。其实就是枚举需要打开的圆环即可,只不过需要判断什么时候这样打开的圆环一定可以最终连成一条链。不难想象:当剩下的圆环中每个圆环的分支原创 2015-04-16 18:37:50 · 941 阅读 · 0 评论 -
例题6-19 自组合 UVa1572
1.题目描述:点击打开链接2.解题思路:本题利用拓扑排序解决。拓扑排序适用于有向图,图中的结点满足给定的“连接”法则而形成一张有向图,通过拓扑排序,可以判断该图中是否含有有向环。本题如果直接按照题意去一个个地尝试拼接正方形,会很耗费时间,因为n的数目会非常大。如果我们进一步抽象,将正方形的标号看做一个拼接点,由于00不能作为拼接点,因此总共有26*2=52个点,那么如果存在另一个正方形B可以和原创 2015-04-02 13:24:50 · 1790 阅读 · 3 评论 -
#296 (div.2) E. Data Center Drama
1.题目描述:点击打开链接2.解题思路:本题要求每个点发出的两条路的方向都要相同,如果这样的路径不完整,需要添加尽量少的一些边使得满足该条件。实际上本题考查的就是欧拉回路,而且欧拉回路必须是偶数条路径。而欧拉回路存在的一个条件是度数为奇数的结点不能超过两个,但本题肯定不能存在度数为奇数的点,否则不可能满足题意。因此所有结点的度数必须为偶数,如果发现有两个点的度数均为奇数,那么就把他们连起来原创 2015-04-08 23:00:38 · 811 阅读 · 0 评论 -
习题6-14 检查员的难题 UVa12118
1.题目描述:点击打开链接2.解题思路:本题利用DFS和欧拉道路解决。本题其实要求找一些路径,使得和要求经过的那些路径能够组成欧拉道路(注意不是欧拉回路,“欧拉道路”是指除了起点和终点外,路径上的其他点的入度等于出度的道路)。首先用dfs来判断连通性,这里用dfs还有另外一个原因就是要统计度数为奇数的点的个数,因为这样的点都需要额外添加一条道路使其度数变为偶数,符合欧拉道路的要求。由于添加一条原创 2015-04-01 23:32:01 · 1066 阅读 · 0 评论 -
#290 (div.2) B. Fox And Two Dots
1.题目描述:点击打开链接2.解题思路:本题利用DFS来解决。本题要求判断一个图中是否存在相同颜色的圈。显然需要利用DFS来寻找。那么该如何寻找呢?题目中已经告诉了我们如何判断一个圈。那么只用根据题意描述来写DFS即可。从没有搜索过的结点开始,每次都找与它相邻的且颜色相同的结点来扩展,此时为了防止重复扩展,需要在DFS参数列表中加上前驱结点。这样以来,一旦发现某一个结点曾经已经标记过,说明找到原创 2015-04-12 21:05:29 · 562 阅读 · 0 评论 -
习题7-15 最大的数 UVa11882
1.题目描述:点击打开链接2.解题思路:本题利用“DFS+剪枝”解决。本题要求在一个矩阵中找到一条数字链,使得它尽量大。不难想象,如果只是单纯地用dfs进行盲目的搜索,那么时间复杂度将是N!级别的,这里的N代表矩阵中所有数字的个数。时间上开销太大,难以承受。需要优化。那么本题该怎么优化呢?通过观察易知,本题有两处可以进行优化,假设已经找到的答案数组是b,目前尝试的数组是c,当前要填的位置是原创 2015-04-19 14:15:09 · 1552 阅读 · 1 评论 -
ZeptoLab Code Rush 2015 B. Om Nom and Dark Park
1.题目描述:点击打开链接2.解题思路:比赛时候这道题没有做出来,第二天早晨补题时才发现就是简单的DFS应用。题目要求出最少需要增加几盏路灯。假设我们已经知道了root的左子结点一共有suml盏路灯,右子结点一共有sumr盏路灯,那么比较一下d[lson(root)]+suml和d[rson(root)]+sumr的大小即可。此时需要增加的路灯数量就是两者差的绝对值。同时返回较大的数即得到ro原创 2015-04-05 11:15:31 · 976 阅读 · 0 评论 -
习题6-8 空间结构 UVa806
1.题目描述:点击打开链接2.解题思路:本题考查四分树的遍历。本题实质上是已知一棵四分树求黑色结点的编号;已知黑色结点的编号反过来构造四分树。第一种情况相当于编码,我们用先序遍历解决。用encode函数表示给整个四分树编码,如果发现内部既有0又有1出现,那么将其均分为四份,递归编码;反之则统计该结点的颜色以及路径。这里把路径编码成一个十进制数,便于转换。同理,如果已知了黑色结点,那么首先解码出原创 2015-04-04 01:29:27 · 1598 阅读 · 0 评论 -
例题6-18 雕塑 UVa12171
1.题目描述:点击打开链接原创 2014-08-28 13:38:24 · 3250 阅读 · 5 评论 -
习题6-6 修改天平 UVa12166
1.题目描述:点击打开链接2.解题思路:本题利用dfs解决,不过思维上要发挥一些创造性。本题问至少要修改的砝码个数,那么首先可以想到要选一个基准砝码,其他所有的砝码都试图根据这个基准法吗而改变。不过本题的巧妙之处就在这里,只要以深度为depth(depth从0开始)重量为w的砝码为基准,那么就能求出整个天平的总重量,即w*2^(depth),在代码中可以简洁地表示为wth。这样,我们只用统计每原创 2015-04-01 14:40:44 · 1290 阅读 · 0 评论 -
例题6-13 古代象形符号 UVa1103
1.题目描述:点击打开链接2.解题思路:本题给出了一张图片的16进制的编码,要求找出这张图片中出现的符号。解码成二进制字符串后,实际上就是用普通的dfs解决了,不过如何进行dfs是本题的关键。根据题意,每个符号的不同之处在于“洞”的个数不同,这就是它们的特征值,因此只要能够找出每个图形的洞的个数,即可确定图案是谁了。为了能够更好地进行dfs,我们需要先将图案外侧的所有0给标记掉,这里用字符原创 2015-03-31 23:35:13 · 1986 阅读 · 1 评论 -
例题6-22 战场 UVa11853
1.题目描述:点击打开链接2.解题思路:本题初看起来比较麻烦,不妨简化一下:先判断是否有解,再考虑如何求出解。根据题意描述,相当于在一个正方形中有若干个圆形障碍物,问是否能从左边界走到右边界。判断是否有解需要一点创造性的思维:不妨把正方形当做一个湖,所有的圆形都是垫脚石,假设我们可以从上边界“踩着”垫脚石成功走到下边界,说明左右边界是不连通的;否则就是连通的。想到了这里,便不难用dfs或bfs原创 2015-03-31 18:54:47 · 1748 阅读 · 2 评论 -
例题1.14 填充正方形 UVa11520
1.题目描述:点击打开链接2.解题思路:本题要求字典序最小,由于n的范围比较小,直接尝试按照字典序填写每个格子即可。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#include#include#include#include#include#include#include原创 2015-03-13 21:26:08 · 850 阅读 · 0 评论 -
习题7-14 小木棍 UVa307
1.题目描述:点击打开链接2.解题思路:本题是一道非常经典的回溯法+剪枝的搜索题目。根据题意,我们可以注意到有下面4处重要的剪枝:(1)把所有的木棍从大到小排序,优先使用长木棍,这样可以加快组合速度,而且对后面的剪枝有帮助。(2)在枚举可能的长度时候,范围在[maxlen,sum/2]之间,如果都没有,那么答案只能是sum。(3)拼出的木棍长度一定是sum的约数。(4)在dfs原创 2015-10-11 00:05:30 · 1226 阅读 · 0 评论