搜索&枚举&遍历&回溯
文章平均质量分 54
几种搜索算法集合
_rhinoceros_
非淡泊无以明志,非宁静无以致远。
展开
-
Codeforces Global Round 14 F. Phoenix and Earthquake题解(生成树,dfs)
一、题目大意及算法分析给n个点,m条边的图,所有边被摧毁,然后要建一棵树把点都连起来。第i个点有ai的材料,要连一条边需要x的材料,要修i点到j点的边,必须i点和j点总共有x的材料。在修好的边上可以运输材料。问能否建出这棵树,要连哪些边,连边顺序是什么。1.输出YES的条件是什么?猜想,如果所有点权和不到(n−1)∗x(n-1)*x(n−1)∗x,则一定可以在任意一个生成树上完成建图,只要考虑顺序就行了。(心里想的是材料反正可以随便运)证明如下:①对于一棵生成树,其某个叶子结点u,若其点权大于原创 2021-10-20 17:10:04 · 199 阅读 · 0 评论 -
(细节处理)(枚举)洛谷P1473 零的数列 Zero Sum
一、算法分析刚开始打算用搜索,在dfs函数中记录每次累加的值,然后看到数据规模相当小,于是就直接写了一个dfs爆搜所有的运算符可能,然后再验证,这个验证过程是比较麻烦的,涉及一些细节问题。尤其是对于空格的处理。具体解释在代码里。二、代码及注释#include<iostream>#include<cstring>#include<cstdio>#inc...原创 2020-02-06 02:00:25 · 260 阅读 · 0 评论 -
(细节处理)洛谷P1378油滴扩展
一、算法分析这道题相当于枚举加模拟,编写代码时最好用自顶向下的方法,先写主函数,把子函数空着,等主函数写完再写子函数。主函数的框架很简单,可以套用stl的next_permutation作为外层循环,然后内层每次计算油滴的半径(算半径可以用子函数实现)即可,然后每次拿局部答案和总答案比较,找出最优解。此外四舍五入的输出方式也要注意。详见代码注释二、代码及注释#include<iostream>#include<cstdio>#include<cstring>#原创 2020-05-08 23:07:54 · 158 阅读 · 0 评论 -
(枚举)洛谷P1556幸福的路
一、算法分析暴力和枚举几乎是一个同义词,看到数据范围,n最大只有10,这就几乎等于直接告诉你要进行枚举了。紫书上有一道例题UVA140 带宽 Bandwidth提供了生成排列的思路。枚举出所有到达牛的顺序,这样对于每次移动,我们只需要关心当前牛和下一头牛之间的关系(如果不剪枝的话)再在必要的地方进行剪枝(剪枝显然是要剪的)。剪枝方案如下:1、要求所有路径都必须是(正东南西北),我们可...原创 2020-01-22 17:03:13 · 239 阅读 · 0 评论 -
洛谷P1461 海明码 Hamming Codes(P9)
一、算法分析题目的关键在于,对于所找出的编码,任两两编码之间都至少有 d 个单位的 “Hamming距离”。解决方案即从起始数0开始,进行编码生成(实则就是从0开始枚举十进制数1,2,3,4…并转换为二进制数)。然后将生成的编码和前面的编码一一比较,只要保证当前生成编码和前面任一编码的hamming距离都大于等于d,则最后所有的编码都是满足条件的。这里求算hamming距离的方法,可以联系树状数...原创 2020-01-15 17:32:18 · 227 阅读 · 0 评论 -
(字符串、迭代加深搜索)洛谷P1032 字串变换
一、算法分析首先题目说若在10步之内有解就输出步数,十步之内无解就是NO ANSWER,这就说明了搜索的深度不会超过十步,可以考虑用迭代搜索。迭代深搜基本框架和数据的读入写好之后,就是处理细节了,刚开始打算用链表做,结果自不常用链表,一直写错,后来发现可以用string类里面的find函数和replace函数来解决题目中的替换问题,find函数的作用是在a串中找到b串第一次出现的地方,用法a.f...原创 2020-02-08 23:12:41 · 262 阅读 · 0 评论 -
(迭代加深搜索)UVA529 Addition Chains(0x24节)
一、算法分析首先本题要求输出序列,我们发现,序列的第一个元素一定为1且最后一个元素一定为n,也就是说,如果用bfs的话,宽度是确定的(从1到n)。但是考虑n的范围过大,用bfs会爆空间,那么就想到使用dfs。要用dfs就要考虑解答树的深度,本题如果用dfs,解答树深度就是序列的长度。由于搜索过程中的解答树节点是随深度指数级增长的,本题解答树深度的最大情况初步估算与n接近(初步估算一下即可,这里不...原创 2020-01-23 15:40:01 · 144 阅读 · 0 评论 -
uva839天平题解
洛谷题目链接本题关键是这个&,在函数的参数名字前加上“&”符号,表明这个参数按照传引用(by reference)的方式进行传递,而不是c语言中默认的传值(by value)方式传递。这样,在函数内改变参数的值,也会修改到函数的实参。(见紫书第103页)。这样的话,当存在子天平的情况时,子天平的总重量就会在一次次函数调用中累加起来,而不是最开始时默认的0.这样,子天平就可以被当...原创 2019-07-03 18:02:05 · 250 阅读 · 0 评论 -
dfs-Uva524素数环题解(dfs、输出格式、筛素数)
题目链接题目戳这里基本思想深度优先搜索结合回溯思想,这是很经典的样板题。值得注意的是,这道题在输出格式上需要细心,还有筛素数可以用打表方式,此处筛素法用的是著名的Eratosthenes筛法(经典模板)。#include<iostream>#include<cstring>#include<cstdio>#include<cmath>...原创 2019-11-16 20:55:28 · 157 阅读 · 0 评论 -
(dfs)[USACO08NOV]Guarding the Farm S
一、算法分析这道题和POI2007的一道题目GRZ-Ridges and Valleys如出一辙,只是本题求的是山峰,POI那道题求的是山峰和山谷。当时POI那道题是自己在ACwing上面看到的,这里推荐一下ACwing这个网站,这个网站是之前的一个NOI金牌得主闫学灿创办的,里面很多题目有闫学灿大佬的视频讲解,讲的还是很好的。POI那道题就是自己看了视频才会的,所以这道题很受yxc大佬码风的影响。简单来说就是一个找连通块问题,所以外层基本框架是统计所有的数字相同的连通块。但是不是所有连通块都是满足原创 2020-07-13 21:32:08 · 169 阅读 · 0 评论 -
(每日水题001-1)(dfs回溯)洛谷P1692 部落卫队
为了增强自己的代码能力,巩固基础,决定从今天开始,每天水一点简单DP和简单搜索。标题定为每日水题001-1等,把代码贴在csdn上。一、算法分析dfs加回溯解决,这类涉及最优方案的,可以设置一个a数组存最优方案,设置一个path数组存当前dfs的方案,在dfs中统计当前答案,当前dfs结束时,比较当前答案与最优答案,进行更新。二、代码及注释#include<iostream>...原创 2020-02-21 10:03:26 · 358 阅读 · 0 评论 -
(dfs)[USACO3.4]“破锣摇滚”乐队 Raucous Rockers
一、算法分析自己初步分析是一个dfs问题,(据说还可以DP?但是我加上一点点剪枝和回溯之后比好多DP都快,下次再写个DP的)。容易想到如果当前歌曲不选,那么以后永远不会再选了,且对于任何一个新的歌曲,只有三种选择:不选、放到最后一张CD里(此时要求最后一张CD容量足够)或者新开一张CD。但是本题一些细节还是要注意。一个是可以最优性剪枝(详见代码),还有就是在新开一张的时候要处理一些细节(详见代码)。可能是半夜打代码的原因,写完之后几个点死活不对,然后发现自己把n和m搞混了两次,还有一次把n写成n-1二原创 2020-07-03 00:27:05 · 673 阅读 · 0 评论 -
(dfs变枚举)洛谷P1467 循环数 Runaround Numbers
一、算法分析本题显然可以用dfs来做,但是相对来讲,用枚举更加方便,我们从m+1开始进行枚举,找到的第一个满足条件的数就是答案,因而它的主程序是长这样的:int main(){ cin>>m; while(true){ m++; //要比m大的 if(work(m)){ cout<&...原创 2019-12-21 17:11:19 · 198 阅读 · 0 评论 -
[USACO17FEB]Why Did the Cow Cross the Road III 牛为什么过马路(floodfill连通块)
一、算法分析基本算法:floodfill连通块具体实现:看数据范围,发现不同的点之间如果要一个个判断肯定是超时的,所以要统计各个连通块的规模,不同连通块的点不可到达,乘法计算就行。统计连通块规模用floodfill,乘法计算可以用一个前缀和来优化一下。记录本题中路径的方式这里用了一个set数组。二、代码#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#原创 2021-10-17 10:13:21 · 229 阅读 · 0 评论 -
UVA816 Abbott的复仇 Abbott's Revenge(完善紫书代码)
一、写在前面紫书上的代码没有给全,缺省了输入函数和一些定义,自己补全了一下,同时加了一些注释。反复修改,交上去终于对了。Tip1:输出格式很坑Tip2:读入很麻烦,所以最好写完读入函数之后,试验一下,再写后面的。免得最后如果出错了很难找错。自己写完读入函数之后,试验过程中就改出了不少错误。二、代码及注释#include<iostream>#include<cstrin...原创 2020-01-16 23:10:40 · 263 阅读 · 5 评论 -
(flood fill优化BFS)(无代码)洛谷P1649 [USACO07OCT]障碍路线Obstacle Course
一、算法分析求有障碍情况下,A到B的最小转弯数,显然如果是最短路,那就当然是一道模板题了,但是本题要求是求最小的转弯次数,这就要用到flood fill的思想了以样例来说. x A. . .B x .直接观察得出,最后的路径显然是从A开始,向下走一格,再走到最左边,再向下走一格,总转弯次数是2.当用flood fill算法的时候,对于第一次拓展,就可以向下直接走到底(也就...原创 2020-01-16 09:41:45 · 245 阅读 · 0 评论 -
洛谷P1588 丢失的牛
一、算法分析典型的bfs问题,结果自己做的时候有些糊,犯了很多低级错误(在代码中有注释),另外代码虽长,但是写到后面那些行基本就是直接复制前面行的代码。。。二、代码及注释#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<ve...原创 2020-01-16 01:21:55 · 349 阅读 · 0 评论 -
uva122树的层次遍历全过程详解-紫书题分析
原题链接-洛谷代码是模仿lrj大神的,在这里主要写一些自己的理解和分析,希望可以帮助大家理解这道题。本题的最大节点数为256,且并未指出最大深度,所以如果用编号思想的话,要编号到2的256次方,我们都知道这是个天文数字,即使用高精度也是不好做的。而且我们完全没有必要用到编号,因为即使编号了,这课树的绝大多数编号也都是没有被使用的,(最坏情况下是大概是2的256次方-256个未使用),所以可以说...原创 2019-06-18 07:54:34 · 456 阅读 · 0 评论