dfs

Hdu 3887 Counting Offspring \\ Poj 3321 Apple Tree \\BZOJ 1103 [POI2007]大都市meg

霸气de小男生 提交于 2020-04-03 07:14:09
这几个题练习DFS序的一些应用。 问题引入: 给定一颗n(n <= 10^5)个节点的有根树,每个节点标有权值,现有如下两种操作: 1、C x y 以节点x的权值修改为y。 2、Q x 求出以节点x为根的子树权值和。 最直观的做法, 枚举一个子树内所有节点的权值加和。但这种做法的每一次讯问的时间复杂度是O(n)的,很明显无法满足题目的需要,我们需要更优的解法。 我们考虑DFS序的另外一种形式,当访问到一个节点时记下当前的时间戳,我们设它为L[x], 结束访问一个节点时当前的时间戳设为R[x]。则以x为根的子树刚好是下标为L[x]和R[x]中间的点。我们看下面这个例子。 有了DFS序这个性质我们就可以讲这个问题转化成一个区间求和问题。 每一次询问的复杂度就是O(logn)级别的,完全可以接受。 另外:很多人习惯在生成DFS序的时候,叶子节点的进出时间戳差1,我习惯于叶子节点的进出时间戳一样。这样根节点的时间戳为[1,n] 比如说:上图中如果采用叶子节点进出时间戳差1的写法,DFS序为:4、3、1、7、7、1、2、6、6、2、3、5、8、8、5、4.数量为2*n 如果按照我习惯的做法,DFS序为:4、3、1、7、2、6、5、8. 两种做法都可以,我习惯于第二种。 练习题: 第一题: http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意

深度优先搜索(DFS)思路及算法分析

♀尐吖头ヾ 提交于 2020-04-03 04:30:58
1、算法用途 用于遍历图中的节点,有些 类似于 树的深度优先遍历 。这里唯一的问题是,与树不同,图形可能包含循环,因此我们可能会再次来到同一节点。 2、主要思想 借用一个邻接表和布尔类型数组(判断一个点是否查看过,用于避免重复到达同一个点,造成死循环等),先将所有点按一定次序存入邻接表,再通过迭代器,对邻接表的linklist和布尔数组做出操作,从而达到不重复递归遍历的效果。 (邻接表是表示了图中与每一个顶点相邻的边集的集合,这里的集合指的是无序集) 3、代码(java) (以上图为例的代码) 1 //深度优先搜索 2 import java.io.*; 3 import java.util.*; 4 5 //This class represents a directed graph using adjacency list 6 //representation 7 class Graph 8 { 9 private int V; // No. of vertices 10 11 // Array of lists for Adjacency List Representation 12 private LinkedList<Integer> adj[]; 13 14 // Constructor 15 Graph(int v) 16 { 17 V = v; 18 adj =

671.Second Minimum Node In a Binary Tree

|▌冷眼眸甩不掉的悲伤 提交于 2020-04-01 14:08:58
题目来源: https://leetcode.com/problems/second-minimum-node-in-a-binary-tree 自我感觉难度/真实难度: 题意: 分析: 自己的代码: class Solution: def findSecondMinimumValue(self, root): """ :type root: TreeNode :rtype: int """ def dfs(root): if not root: return se.add(root.val) if root.left: dfs(root.left) if root.right: dfs(root.right) se=set([]) dfs(root) a=list(se) a.sort() if len(a)<2: return -1 return a[1] Runtime: 32 ms, faster than 100.00% of Python3 online submissions for Second Minimum Node In a Binary Tree. 代码效率/结果: 优秀代码: def findSecondMinimumValue(self, root): self.ans = float('inf') min1 = root.val def dfs

HDU5937 Equation(DFS + 剪枝)

女生的网名这么多〃 提交于 2020-03-30 13:41:53
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5937 Description Little Ruins is a studious boy, recently he learned addition operation! He was rewarded some number bricks of 1 to 9 and infinity bricks of addition mark '+' and equal mark '='. Now little Ruins is puzzled by those bricks because he wants to put those bricks into as many different addition equations form x+y=z as possible. Each brick can be used at most once and x, y, z are one digit integer. As Ruins is a beginer of addition operation, x, y and z will be single digit number. Two addition equations are different if any number

HDU 1427 速算24点【数值型DFS】

允我心安 提交于 2020-03-30 09:30:02
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2562 Accepted Submission(s): 606 Problem Description 速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。 Input 每组输入数据占一行,给定四张牌。 Output 每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。 Sample Input A 2 3 6 3 3 8 8 Sample Output Yes No 【分析】: 简单的DFS,dfs(sum,next,p)表示当前已经算出的值是sum,括号中算出的值是next,当前使用的卡片下标为p,实际上是把括号外和括号内的两部分值分成sum和next来处理了。

24点游戏&&速算24点(dfs)

て烟熏妆下的殇ゞ 提交于 2020-03-30 09:29:41
24点游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status 24 24点就是给你一串数字,问你是否通过加减乘除括号构成 24 24点。 沈爷觉得这个很好玩,就决定考考你,给你 4 4个数,可以交换位置,可以用加减乘除和括号,是否能构成 24 24点呢? 注意哦~这里的除法并不是整数除法,比如样例 Input 第一行 T T,表示有多少组测试数据, 1 ≤ T ≤ 50 1≤T≤50 接下来 T T行,每行 4 4个正整数 a 1 a1, a 2 a2, a 3 a3, a 4 a4,表示每个数都是多少, 1 ≤ a i ≤ 13 1≤ai≤13 Output 对于每一次询问,如果能够凑成 24 24点,输出 yes ,否则输出 no Sample input and output Sample Input Sample Output 2 3 3 8 8 1 1 1 1 yes no Hint 3 3 3 3 8 8 8 8 就可以构造出 8 ÷ ( 3 – 8 ÷ 3 ) = 24 题解:求24点,暴力搜索下就好,刚开始我想着全排列下,然后按照顺序来进行,但是思路明显不完善,然后看了大神的, 大神是延长数组存放当前运算的解,vis记录是否用过

运输计划

人走茶凉 提交于 2020-03-30 02:33:06
题目描述 公元 2044 年,人类进入了宇宙纪元。 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球。 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰。 为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小 P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。 在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后, 这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的 物流公司的阶段性工作就完成了。 如果小 P 可以自由选择将哪一条航道改造成虫洞,试求出小 P 的物流公司完成阶段 性工作所需要的最短时间是多少? 输入格式 第一行包括两个正整数 n、m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。 接下来 n-1 行描述航道的建设情况,其中第 i 行包含三个整数 ai, bi 和 ti,表示第i 条双向航道修建在 ai 与 bi 两个星球之间

算法笔记--数位dp

≡放荡痞女 提交于 2020-03-30 02:25:32
算法笔记 这个博客写的不错: http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置。 模板: int a[20]; ll dp[20][state];//不同题目状态不同 ll dfs(int pos,/*state变量*/,bool lead/*前导零*/,bool limit/*数位上界变量*/)//不是每个题都要判断前导零 { //递归边界,既然是按位枚举,最低位是0,那么pos==-1说明这个数我枚举完了 if(pos==-1) return 1;/*这里一般返回1,表示你枚举的这个数是合法的,那么这里就需要你在枚举时必须每一位都要满足题目条件,也就是说当前枚举到pos位,一定要保证前面已经枚举的数位是合法的。不过具体题目不同或者写法不同的话不一定要返回1 */ //第二个就是记忆化(在此前可能不同题目还能有一些剪枝) if(!limit && !lead && dp[pos][state]!=-1) return dp[pos][state]; /*常规写法都是在没有限制的条件记忆化,这里与下面记录状态是对应,具体为什么是有条件的记忆化后面会讲*/ int up=limit?a[pos]:9;//根据limit判断枚举的上界up;这个的例子前面用213讲过了 ll ans

数位DP

蓝咒 提交于 2020-03-28 20:40:25
这篇博客主要是数位DP的模版 基本上数位DP的题目都是比较套路的:一般都是问一个区间中满足条件的数的个数 套路1:差分 [L,R]中的答案 = [0,R]中答案 - [0,L]中答案 + chk(L) 套路2:按位DP(记忆化搜索实现),记录需要的前缀状态,特别的: f = 0/1 代表当前填的数字是否还和上界数字相同 g = 0/1 代表当前是否还在填前导零 复杂度一般为 O(位数*前缀状态数*10) 【P2657 [SCOI2009]windy数】 https://www.luogu.com.cn/problem/P2657 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数? #pragma GCC optimize(3,"Ofast","inline")//O3优化 #pragma GCC optimize(2)//O2优化 #include <algorithm> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <math.h> #include <cstdio> #include

zoj3811 Untrusted Patrol (dfs)

情到浓时终转凉″ 提交于 2020-03-27 17:31:20
2014牡丹江网络赛C题 (第三水的题 The 2014 ACM-ICPC Asia Mudanjiang Regional First Round http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3811 Untrusted Patrol Time Limit: 3 Seconds Memory Limit: 65536 KB Edward is a rich man. He owns a large factory for health drink production. As a matter of course, there is a large warehouse in the factory. To ensure the safety of drinks, Edward hired a security man to patrol the warehouse. The warehouse has N piles of drinks and M passageways connected them (warehouse is not big enough). When the evening comes, the security man will start to patrol the