ACM-搜索
Nicetomeetu-
没有
展开
-
HDU 1495 非常可乐 bfs状态空间搜索
状态空间搜索就是将问题求解过程表现为从初始状态到目标状态寻找路径的过程。普通的搜索是在显式图中进行,从一个节点搜索到其他节点。状态空间搜索是在一个由问题状态构成的隐式图中进行,从一个状态搜索到另一个状态。状态空间搜索和普通搜索的区别无非是,这里搜索的不再是一个个实实在在的节点,而是一个个问题的状态,不过二者思路和方法都是相同的。本题问题的状态可以用四个值来描述,第一个杯子的原创 2017-05-06 21:19:48 · 473 阅读 · 0 评论 -
HDU 5952 Counting Cliques 爆搜
题目 HDU 5952 分析 题目数据很小,可以考虑暴力搜索。为了防止重复,建立一个小编号点指向大编号点的图,这样就不会重复了,因为搜索出来的序列一定是递增的。 这道题目让我懂得了,有时候TLE,不要总想着改进算法,要先确定自己的代码没有任何问题才行。这道题目就是因为一个手误,TLE了,然后就在那里一直想着怎么剪枝。代码如下#include <algorithm>原创 2017-09-28 23:51:51 · 389 阅读 · 0 评论 -
(2017多校训练第三场)HDU - 6060 RXD and dividing dfs
官方题解:把1看成整棵树的根. 问题相当于把2∼n2\sim n2∼n每个点一个[1,k][1, k][1,k]的标号. 然后根据最小斯坦纳树的定义, (x,fax)(x, fa_x)(x,fax) 这条边的贡献是 x 子树内不同标号的个数目difidif_idifi. 那么显然有difi≤min(k,szi)dif_i\leq min(k, sz_原创 2017-08-02 17:30:05 · 376 阅读 · 0 评论 -
UVA1602 Lattice Animals 回溯+set判重
按照题意,只要我们能找出所有n连块,然后再判断能不能放进w*h的方格中就行了。找出所有n连块可以用回溯法,从k连块搜索,通过在其周围放一个方块,从而得到k+1连块,从而这样不断搜索下去直到n连块,搜索过程的判重就交给set了。因为题目中有多组输入,假如连续输入1000组相同的数据,我们都要一遍一遍的dfs吗?显然太复杂。所以我们可以事先把所有可能的输入数据对应的答案打表,这样输出就快的多了。在打表原创 2016-10-16 14:15:03 · 1165 阅读 · 0 评论 -
UVA208 Firetruck 回溯
这道题就是找出1到k有多少条路径,看起来没什么坑,可是写起来总是TLE。其实这道题的数据会专门设置一种数据,那就是1和除了k以外的点都是连通的,可是就是和k不连通。所以我们会浪费很多时间做无用功,其实只要刚开始就判断1和k是否连通就可以避免这种情况。此外在找出1的k的路径总数的时候,刚开始我是这么写的for (int v = 1; v <= maxu; v++)//maxu是最大的点原创 2016-10-16 22:31:31 · 337 阅读 · 0 评论 -
EOJ 1224 简单迷宫问题 bfs
需要注意的是,每个点的权值是不一样的。普通的bfs,每个点的权值都相同,也就是每一层之间的距离是一样的,那么第一次搜索到这个点的时候,层次数最小,就是最短距离。但是这道题中层次数最小并不一定是距离最小,搜索了5层 ' X ',和搜索了6层 ' . ' 哪个距离短?很明显是6层的距离短。所以即便先前已经搜索到了这个点,后面的搜索依然需要将这个点的距离更新。所以我们不需要设vis数组来表示搜索过没有。原创 2016-11-28 16:03:42 · 477 阅读 · 0 评论 -
EOJ 1780 Escape bfs
这道题就是一道单纯的bfs,不过难点是如何表示转弯,也就是说当人面朝南的时候,左转,右转,前进分别对应着矩阵中的上下左右的哪几种情况呢?这道题和刘汝佳书上的一道迷宫类似,那道题的难点也是如何表示方向。我们假设0,1,2,3分别表示北,西,南,东。一般的bfs我们不都是要设一个行走数组吗, 现在我们把数组设成const int dx[] = {0, 1, 0, -1};//左下右上co原创 2016-11-29 11:05:27 · 439 阅读 · 1 评论 -
EOJ 1154/ UVA 12558 埃及分数问题 迭代加深搜索
我们称呼分子为1的分数为埃及分数对于把一个分数拆解成n个埃及分数相加的形式的方法肯定是多种多样的,例如 59/211 = 1/4 + 1/36 + 1/633 + 1/3798 = 1/6 + 1/9 + 1/633 + 1/3798.那么我们会选择哪种呢?partychen告诉我们:1.分解所需要的数越少越好2.当1相同时,最后一个分数越大越好,即分母越小越好3.当1,2原创 2016-12-04 16:00:06 · 939 阅读 · 5 评论 -
EOJ 2253 深度优先搜索
简单的深度优先搜索,题目有3点需要注意1.dfs的时候标记的处理2.搜索的时候要按照字典序3.输出不要忘了空行代码如下:#include #include #include #include #include #include #include #include using namespace std;int dx[8] = {-1, 1, -2, 2,原创 2016-12-10 10:19:29 · 449 阅读 · 0 评论 -
EOJ 2521 深度优先搜索
题意理解了很久。大意就是找到一个最高的点,高度为h,这个点周围的点中高度小于等于h的点都能被监视到。同样的与周围的点相邻的点中,如果高度比周围的点的高度还要小,那些点也能够被最高的点监视到。也就是视角具有传递性。如果还不理解的话,可以想成找到一个的点,往下浇水,水可以流向高度小于或者等于自己的点。题意就是问我们最少要浇几次水。先按照高度对这些点排序,然后遍历,如果没有访问过,就dfs将其周围符原创 2016-12-10 11:53:43 · 332 阅读 · 0 评论 -
EOJ 1120 阅读理解/状态空间搜索
一个二维矩阵看成一个状态,按照题目的要求bfs就行了。判重用set。最最最最最最重要的是,这道题目居然神奇般的输出是纵坐标在前,横坐标在后。写代码的时间还没有理解题目的时间长==#include #include #include #include #include #include #include #include #include using namespace st原创 2016-12-11 11:49:28 · 620 阅读 · 2 评论 -
EOJ 1162 tom and jerry bfs
说是用到bfs,其实我们注意到每次只有一个状态进队,所以根本不需要队列。另外注意,这道题转弯也耗时间,一开始我误以为转方向和直行总共耗时1,实际上这是两个过程,所以总耗时是2。而且有可能tom和jerry根本不可能相遇,所以我们设置如果耗时超过1000000就认为是无法相遇。代码如下:#include #include #include #include #includ原创 2016-12-17 17:05:34 · 381 阅读 · 0 评论 -
EOJ 1148 质数阵 dfs
很容易超时的一道题目。有两种优化方法:奇偶优化或者二分1:奇偶优化,在填数字的时候,我们不是要枚举吗?可以先看一下它周围的数是奇数还是偶数,如果是奇数我们只需要枚举偶数就行了,如果是偶数我们只需要枚举奇数,因为这样才能保证他们的和是质数,也就是和是奇数。这样循环的代价就减少了一半。2.二分。在给一个空位填数字的时候,我们先看它周围的数字是x,然后再二分找到第一个比x大的质数y。然后从y开始原创 2016-12-23 18:59:35 · 377 阅读 · 0 评论 -
UVA 1103 Ancient Messages dfs
按照《算法竞赛入门经典》的思路,我们只需要判断出当前文字有几个“洞”,就可以确定到底是哪个文字了。W:零个洞A:一个洞K:两个洞J:三个洞S:四个洞D:五个洞本题重点就是如何判断一个文字有几个洞。我们知道每一个文字都是由很多个 "1" 组成的,背景是 “0”。请看下面这个文字:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0原创 2017-05-01 17:12:41 · 545 阅读 · 0 评论 -
BZOJ - 4428 记忆化搜索
#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <set>using namespace std;typedef long long int LL;const LL INF = 1e18;const原创 2017-10-15 18:21:44 · 516 阅读 · 0 评论