
算法之深度优先搜索(dfs)
文章平均质量分 88
code_mryxj
这个作者很懒,什么都没留下…
展开
-
poj1321
用结构体存每一次确定放点后,变换后的地图情形。#include<cstdio>#include<algorithm>struct Map{ char a[10][10]; int x;};int n,k;long long sum;void dfs(Map tmp,int step){ if(step==k+1) { sum++;原创 2015-05-15 10:57:46 · 444 阅读 · 0 评论 -
uva572 Oil Deposits
题意:寻找“@”构成八连通的块数。思路:深搜入门水题#includeusing namespace std;const int inf=0x7fffffff;int cnt,v[110][110],n,m,nxt[8][2]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1};char M[110][110];void dfs(int x,int y)原创 2016-01-15 19:17:15 · 718 阅读 · 0 评论 -
uva 140 Bandwidth
题意:《算法竞赛入门》 196页 思路 : 输入比较特殊,其他正常可以暴力枚举全排列。中间考虑剪枝,在搜索的过程出现的最大带宽比已有还要大就return。但是这题数据太弱了,不剪29ms,剪枝0ms. 由于是全排列问题,也可以直接调用next_permutation()函数简化代码。 dfs无剪枝#include<bits/stdc++.h>using namespace std;原创 2016-03-17 12:28:18 · 399 阅读 · 0 评论 -
UVA208 Firetruck
题意:给你一些城市相连的关系,问你能否从第一个城市,到第k个城市,并按照字典序输出路径。 城市个数小于20,直接搜有个很坑爹的地方,数据里面会有第一个城市无法到k的情况,所以在暴力全排列的时候,你判断一下第一个城市是否能到第k个城市。还有一个剪枝处理是妙用floyd,得到城市之间是否有通路的关系数组,进行剪枝。方法一:先判断第一个城市到第k个城市是否有解。#include <fstream>#i原创 2016-03-18 01:01:32 · 350 阅读 · 0 评论 -
poj1426(bfs dfs)
对于一个整数,问大于等于这个整数的一个整数能够被其整除的整数,且这个整数只能包括0和1解题思路:看了有些大神做法,取模神马的好复杂,其实可以直接从前往后两个方向的深搜就可以搜到。#include<cstdio>#include<algorithm>long long n,DEP;long long s;bool flag;void dfs(long long i,int step){原创 2015-05-15 10:39:48 · 520 阅读 · 0 评论 -
uva1103 Ancient Messages
这题剥去洋洋洒洒的体面,就是求连通块个数,和连通块里空白区域的个数,最后判断是哪个象形字,好有创意。题意:给你象形字的图形,给你一个01矩阵,拓扑等价画出这些象形字,判断图中 有哪些象形字。思路:观察可以发现,每个象形字的空白块数是不同的,因此用dfs求出每个象形区域的联通块数就可以判断是那个字,按照字典序输出。 最初,我在想怎么找到恰好每个字的范围才能找它里面有多少空白区域。所以这原创 2016-01-16 13:44:59 · 807 阅读 · 0 评论 -
uva12558 (迭代加深搜索)
题目链接 题意:对一个分数(n/m)将它分解成若干个不相等的单分子分数(即分子为1)。求最少能分解成哪几个分数相加。若有多解,输出最大的分母尽量的小的解。会有k个禁止使用的单分子分数。 思路:这题搜索的特点就是深度和宽度都不确定,首先对于一个a/b,你不知道他的最优解有几个1/a类似形式的分数构成,这是宽度。对于每个1/i他的深度也是不确定的,唯一剪枝的条件就是确定深度后余下都选择1/i之和小于原创 2016-07-29 13:24:34 · 1022 阅读 · 0 评论 -
hdu2376 Average distance
题意:求一个树上任意两点距离的平均值。 思路:如果枚举任意两个点来求,一定会超时,不如换个思路,求每个边的贡献次数边权值的和就是任意两点距离的总和。然后除以总路径数之和n(n-1). 而每个边的贡献次数等于每个边两边顶点个数的乘积(这个自己举个例子),然后这题就可以转换成在一个有根树里,求每个顶点构成子树的节点个数,一遍dfs就可以得到,dfs写法见代码.选根这题,没有特定要求,可以任取。最后注原创 2016-07-31 17:29:00 · 1055 阅读 · 0 评论 -
poj1985Cow Marathon (树的最长路径)
题意:求树上权值最大的一条道路。 思路:树上最长路径的裸体,常见做法两种。 1.树形dp : d(i):表示根为节点i的子树中根到叶子的最大距离。d(i)=max( dp[j])+1. j为i亲儿子。 把所有子结点 的d(j)求出来后,设d值前两个最大的是u,v,则d(u)+d(v)+2就是所求。2.随便找一个结点u,用dfs或bfs求离它最远的点v,然后以v为起点,再用一次dfs或bfs求出原创 2016-10-12 23:47:00 · 849 阅读 · 0 评论 -
hdu1010 Tempter of the Bone
题意:在一个n*m迷宫上,规定一个起点和终点,有墙‘X’ ,问起点到终点能不能恰好K步,走过的路不能再走。思路:暴力深搜,直接TLE。自己想了好几种剪枝,最重要的剪枝:map奇偶剪枝之前没有接触过...就一直TLE。介绍一下奇偶剪枝,在对一个地图进行01编号 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1原创 2016-01-15 19:07:31 · 278 阅读 · 0 评论 -
poj3279 (搜索,好题**)
前题:这题是之前 做邝斌搜索专题遗留下的三题之一,最近为了复习搜索姿势补上。题意:最大15*15平面(二维数组)有1有0,对一个地方操作,与他相邻四个包括他自己会翻转(0变1,1变0),求出最少的操作让全部变成0,输出操作位置图。思路:很明显每个点操作一次就够了,两次恢复原样,然后 我就想不到了...15*15 对每个点搜索 不可能,广搜?从那个点开始?然后就去搜题解,原来是对第一排搜索,原创 2015-12-12 11:39:55 · 491 阅读 · 0 评论 -
hdu1495(非常可乐 dfs)
题目链接 这题题意真让我想到小时候做过的脑筋急转弯,讲的是给你三个杯子,第一个杯子大小是后两个杯子大小之和,且第一个杯子开始是满的,其他两个是空的,问你经过多少次倒来倒去,能够是两个杯子里一样多平分最初可乐总量也就是第一个杯子的大小,不能就输出NO。 开始真的没有思路,联想了一点,如果杯子大小是奇数,肯定就不能倒出来,因为杯子大小都是整数不能倒出0.5出来吧。 后来看了别人题解。。。(果然题做原创 2015-05-26 22:43:08 · 1094 阅读 · 0 评论 -
poj2386(dfs)
搜索的水题吧!#include<cstdio>char a[101][101];int n,m,next[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};void dfs(int x,int y){ a[x][y]='.'; for(int i=0;i<8;i++) { int tx=原创 2015-05-24 21:19:21 · 448 阅读 · 0 评论 -
poj2676数独(dfs)
#include<cstdio>using namespace std;int v[100][2],a[10][10],num,flag;bool judge(int x,int y,int k){ for(int i=0;i<9;i++) { if(a[x][i]==k) return 0; if(a[i][y]==k) return 0;原创 2015-05-24 16:53:48 · 543 阅读 · 0 评论 -
poj1129(没有优化)
题意: 在一个地图上相邻的点不能用同一个电台,问最少一共需要多少个电台。 思路:用邻接矩阵存点相邻的情况,从一个数量开始枚举能否满足,不足就加一个数量,知道得到最少满足题意电台的数量。//#include<bits/stdc++.h>//poj不能这个头文件#include<iostream>#include<cstring>#include<cstdio>using namespace原创 2015-07-04 15:11:40 · 434 阅读 · 0 评论 -
Hdu1242(bfs+优先队列or dfs)
题意:和最普通迷宫类问题差别在于,他的路上会有x,这个x会让他多停留一秒,而用用最基础的宽度搜索,永远搜的是地图上最短的路径,而忽略x的加成,如果那条最短的路上有很多x,加起来比远的没有x的路时间长多了。 所以,开始我就wrong了很多次,(果然太弱了),后来想啊,用广搜把每条都去的地方扫一下,选个时间最短的就好了,结果。。。。案例怎么广搜都只能扫出一条,别的自己想数据的也扫不全。。。后来想啊想。原创 2015-07-13 10:30:48 · 574 阅读 · 0 评论 -
百练2775 九度 1114
神奇的口袋 九度 - 1114 时限: 1000MS 内存: 32768KB 64位IO格式: %lld & %llu问题描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的原创 2015-09-04 21:14:28 · 594 阅读 · 0 评论 -
poj1011(dfs+目前做的最好的剪枝)
题意:n根不同长度的小棍,拼成若干长棍,要这些长棍的长度相等,并且小棍刚好用完,问拼成长棍的最短长度是? 前话:这题是在暑假第一天搜索专题下,作为自己复习的练手题目,其实是又一次加深学习搜索的思想(弱已跪)和回溯的一些理解。 思路:表明上初看此题就像是搜索,(我开始也想过二分,这并不是只有一种可行,而是找到最短),首先考虑搜索的方向,最短,那肯定是从最短的情况开始递增,最短的可能情况那肯定就是最原创 2015-07-11 23:07:31 · 676 阅读 · 1 评论 -
hdu1016(素数环剪枝dfs)
题意:n<20范围,搜一个全排列,满足素数环,相邻两个数字和为素数,最后一位和第一位之和也是素数。 剪枝:每一位都先先判断再搜索。#include <fstream>#include <iostream>#include <string>#include <complex>#include <math.h>#include <set>#include <vector>#includ原创 2015-12-10 21:42:21 · 664 阅读 · 0 评论 -
hdu5927 2016 东北赛F Auliary Set
题意:在一颗1为根的树上,又很少一部分的不重要的点,其他都是重要的点,问满足条件的点有多少个? 满足条件有两种情形:1.为重要的点。2.他的亲孩子至少有两个不同的重要的点。 思路:先预处理每个点的孩子个数,和父亲是谁。在对于比较少的m个不重要点,求是否满足有两个不同的重要点孩子。这个求法是O(m)。 怎么做呢?对m个点深度排序,从最深的点开始,满足孩子数>=2就计数,不满足就把他父亲的孩子数-原创 2016-09-26 10:32:49 · 536 阅读 · 0 评论