dfs

poj 3252 Round Numbers 数位DP

不问归期 提交于 2020-01-03 10:15:25
"Round Number "被称为其二进制形式中0的个数比1的个数多。求[x,y]区间内“Round Number”的个数。 解1: dp[pos][num],到当前数位pos,0的数量减去1的数量为num的方案数,一个简单的问题,中间某个pos位上num可能为负数(这不一定是非法的,因为我还没枚举完嘛,只要最终的num>=0才能判合法,中途某个pos就不一定了) Hash 最小就-32吧(好像),直接加上32,把32当0用。 这题主要是要想讲一下lead的用法,显然我要统计0的数量,前导零是有影响的。 #pragma comment(linker, "/STACK:10240000,10240000") #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<queue> #include<set> #include<vector> #include<map> #include<stack> #include<cmath> #include<algorithm> using namespace std; const double R=0.5772156649015328606065120900; const int N=1e5+5; const int mod=1e9+7;

DFS(深度优先搜索)---迷宫(洛谷)----SCAU_LEO

我怕爱的太早我们不能终老 提交于 2020-01-02 21:46:16
一.题目 题目链接: 迷宫 首先,今天是1月2日,虽然有点晚了,但是还是祝大家新的一年快快乐乐,开开心心,题题AC,场场拿金,! 说说我对迷宫类题目的感受,我记得刚开始学迷宫的时候,不是看的很懂,但是睡了会儿觉自然就懂了,说明什么,不会的时候就要睡觉!!!(绝对不是宿舍蹲的借口!!)学会了迷宫,说明你对DFS已经有了一定程度的掌握了,递归也很熟悉了! 题目介绍: 题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 题目描述 无 输入格式 第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。 输出格式 给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。 输入输出样例 输入 #1 复制 2 2 1 1 1 2 2 1 2 输出 #1 复制 1 说明/提示 【数据规模】 1≤N,M≤5 说说我的思路吧,对于这道迷宫的题目,人所操纵的物体,只有四种选择,要么上,要么下,要么左,要么右,所以对迷宫类问题,只需要对这四种情况递归就行了,遇到不符合就回溯。这道题目只是说记录能到达的路线个数

Codeforces 1132G(dfs序+线段树)

梦想的初衷 提交于 2020-01-02 12:08:11
题面 传送门 分析 对于每一个数a[i],找到它后面第一个大于它的数a[p],由p向i连边,最终我们就会得到一个森林,且p是i的父亲。为了方便操作,我们再增加一个虚拟节点n+1,把森林变成树。 由于序列不是递增的,不能二分。维护一个单调栈,栈顶元素最小。从n到1依次对每个 数操作,弹出栈里比它小的数。如果栈为空,说明该数是森林中的根节点,向n+1连边。否则栈顶元素就是第一个大于它的数,向它的编号连边即可。 我们发现,对于每个查询区间内的所有数,它对应着树上的某些节点,记为标记节点。如果把标记节点之间的非标记节点去掉,我们就会得到一棵新树,新树上从某个节点到根的一条路径对应着一个满足条件的序列,则最大序列长度等于新树上从叶子节点到根的最长路径。这样,我们就把问题转化为了树上的最长路径。 显然不能对每一个询问建一棵新树。我们发现新树上的路径长度就是原树上的路径经过的标记节点个数,如图(加粗的节点为标记节点)。 所以,我们建立一棵线段树,线段树的叶子节点存储原树上每个节点到根的路径上的标记节点个数,线段树维护最大值。 我们枚举每个长度为k的区间[i,i+k-1],显然从前一个区间转移到当前区间时,只会增加一个标记节点,减少一个标记节点。每增加一个标记节点i,我们就将i的子树内的所有节点的值+1,否则-1。答案即为整颗线段树的最大值 时间复杂度 \(O(n\log n)\) 代码

Hadoop File Splits : CompositeInputFormat : Inner Join

与世无争的帅哥 提交于 2020-01-02 08:15:45
问题 I am using CompositeInputFormat to provide input to a hadoop job. The number of splits generated is the total number of files given as input to CompositeInputFormat ( for joining ). The job is completely ignoring the block size and max split size ( while taking input from CompositeInputFormat). This is resulting into long running Map Tasks and is making system slow as the input files are larger than the block size. Is anyone aware of any way through which the number of splits can be managed

DFS

眉间皱痕 提交于 2020-01-01 23:08:07
思想 从起点出发,标记走过的点,如果发现没有走过的点,随便选一个向前走,无路可走就回退。 应用 判断从V出发能否走到终点 - 判断从V出发能否走到终点,若能,记录路径 Node path[MAX_LEN]; //MAX_LEN取节点总数即可 int depth; //当前点的深度 bool Dfs(V) { if (V为终点) { path[depth] = V; return true; } if (V为旧点) { return false; } 将V标记为旧点; path[depth++] = V; 对和V相邻的每个节点U { if (Dfs(U)) return true; } --depth; //从V走不到终点,把V排除出数组,回退到V的父节点 return false; } int main() { 所有点标记为新点; depth = 0; if (Dfs(起点)) { for (int i = 0; i <= depth; i++) { cout << path[i] << endl; } } return 0; } - 遍历图上所有节点 邻接矩阵存储遍历复杂度 \(O(n^2)\) ,因为对每个节点,都要判断其它所有节点是否相邻。 邻接表遍历复杂度 \(O(n+e)\) 。 例题 1、 城堡问题 给一个地图以及每个格子周围的墙所代表数字之和,求该地图有多少房间

LeetCode 22. Generate Parentheses解题报告(python)

大城市里の小女人 提交于 2020-01-01 05:20:53
22. Generate Parentheses Generate Parentheses python solution 题目描述 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: 解析 还是要采用递归的思想解题。但一定要保证任何时刻"(“的个数要多于”)“的个数。 若出现”)("就绝不可能形成有效的括号 class Solution : def generateParenthesis ( self , n : int ) - > List [ str ] : if not n : return [ ] left , right , ans = n , n , [ ] self . dfs ( left , right , ans , "" ) return ans def dfs ( self , left , right , ans , string ) : if left > right : return if not left and not right : ans . append ( string ) if left :

zju 1119 SPF

我怕爱的太早我们不能终老 提交于 2020-01-01 03:49:55
这个题让我做得有些纠结。将我的做题过程思路写出来。 这是一道深度优先搜索的题目,目的是来求出无线连通图的割点。首先,要明白什么是割点,割点:在一个连通图中,如果去掉了某个点和所有与这个点相连的边后,是图分成了两个部分,变成了一个不连通的图。那么这个点就是割点。还有,就是如何来求割点? 搜索深度:如果节点k的搜索深度为j,则节点k为第j个搜索到的节点。 若有k的儿子为i,我们定义AnceDeep[i]为与结点i相连接的所有节点最小的搜索深度,deep[k]为k的搜索深度(时间戳),那么k为割点当且仅当k满足(1)(2)中的一个: (1) 若k为深搜树的根Root,当且仅当k的儿子数(分支数)>=2时k为割点; (2) 若k为搜索树的中间结点(即k既不为根也不为叶),那么k必然有father和son,若AnceDeep[son]>= deep[k],则k必然为割点。 这样看起来并不好懂,我来引用一个学长写的文章来解释一下上面的(1)、(2)。 根据割点的定义,割点将图分成了两个部分,这个两个部分是靠割点来连通的,如果没有割点存在,那么图将不连通。所以,换句话说,我们要从第一部分的点进入第二部分的话,我们必须经过这个割点。然后接着,我们再考虑图的dfs的时候。由于割点是通往第二部分的门户,那么当我们从第一部分开始对图进行dfs的时候,如果访问了割点,那么再一次回退到割点的时候

图着色问题

时光毁灭记忆、已成空白 提交于 2019-12-31 03:39:46
一、图着色问题 (1)图的m可着色判定问题 给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。 (2)图的m可着色优化问题 若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。 二、m可着色判定问题的解法 【算法】 (1)通过回溯的方法,不断的为每一个节点着色,在前面cur-1个节点都合法的着色之后,开始对第cur-1个节点进行着色, (2)这时候枚举可用的m个颜色,通过和第cur-1个节点相邻的节点的颜色,来判断这个颜色是否合法 (3)如果找到那么一种颜色使得第cur-1个节点能够着色,那么说明m种颜色的方案在当前是可行的。 (4)cur每次迭代加1,如果cur增加到N并通过了检测,说明m种颜色是可满足的。 (5)注意,这里只是要求判断m种颜色是否可满足,所以找到任何一种方案就可以了。 【代码实现】 #include<iostream> #include<cstring> using namespace std; const int maxn = 105; int G[maxn][maxn]; int color[maxn]; bool ans; int n,m,k; void init(){ ans = 0; memset(G, 0 , sizeof G)

单词方阵(dfs)

不问归期 提交于 2019-12-31 02:38:14
给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如: 输入: 8 输出: qyizhong *yizhong gydthkjy gy****** nwidghji n*i***** orbzsfgz o**z**** hhgrhwth h***h*** zzzzzozo z****o** iwdfrgng i*****n* yyyygggg y******g 输入输出格式 输入格式: 第一行输入一个数n。(7<=n<=100)。 第二行开始输入nXn的字母矩阵。 输出格式: 突出显示单词的nXn矩阵。 输入输出样例 输入样例#1: 7 aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa 输出样例#1: ####### ####### ####### ####### ####### ####### ####### 典型的深搜,就是过程有点麻烦,先规定一个字符串yizhong,深度每增加1,对应字符串位置加一。 AC代码; #include <bits/stdc++.h> using

初涉点分治

这一生的挚爱 提交于 2019-12-30 02:50:33
不能说是一个算法,应该算是一类思想 点分治 概念 点分治就是把树上问题中的节点拿来 分治 。 这所谓的“分治”是一个很抽象的概念,那么就先来介绍它的常见应用和其他性质。 大致框架 1 void getRoot(int x, int fa) //找重心 2 { 3 size[x] = 1, son[x] = 0; 4 for (int i=head[x]; i!=-1; i=nxt[i]) 5 { 6 int v = edges[i].y; 7 if (v==fa||vis[v]) continue; //在点分树内寻找重心 8 getRoot(v, x), size[x] += size[v]; 9 son[x] = std::max(son[x], size[v]); 10 } 11 son[x] = std::max(son[x], tot-size[x]); 12 if (son[x] < son[root]) root = x; //root即重心 13 } 14 void dfs(int x, int fa, int c) 15 { 16 record distance_c //将长度为c的路径记录下来 17 for (int i=head[x]; i!=-1; i=nxt[i]) 18 { 19 int v = edges[i].y; 20 if (v==fa||vis