dfs

LCA的一些算法

人盡茶涼 提交于 2020-01-27 03:36:26
  LCA,就是求树上任意两点的最近公共祖先   (本题图片与代码均为Luogu3379)   方法我好像讲过一个,这次把主要的三个一起讲一讲   <1> 倍增(O(n log n))   我们先考虑最基本的LCA,记录每一个点的父节点和深度。   对于两个点x,y,先将它们调到同一高度(令dep[x]>dep[y],即把x向上移(dep[x]-dep[y])步即可,然后一起往上走就可以了。   这复杂度是O(nq)的,所以在此基础上优化。   用father[i][j]表示点j向上走2^i步时的点是多少(没有就是-1),然后每次上移只要走log n次即可。   预处理的话 father[i][j]]=father[i-1][father[i-1][j]];递推即可。   CODE #include<cstdio> #include<iostream> #include<cstring> using namespace std; const int N=500005,P=25; struct data { int to,next; }e[N*2+10]; int head[N*2+10],dep[N],father[P][N],i,j,n,m,x,y,root,k; inline void read(int &x) { x=0; char ch=getchar(); while

矩阵类dfs

て烟熏妆下的殇ゞ 提交于 2020-01-27 01:33:07
dfs即深度优先搜索,正如名字所说,其是一种搜索方式,按照深度进行逐个搜索,dfs常用于回溯算法中,两者十分相似,只是,回溯法是实现方法,深度优先搜索是实现方式,同时在树的相关搜索中也会出现深度优先搜索方式,基本思想和回溯算法类似,不过有个最大不同点是回溯法需要在有回溯过程,而dfs不需要回溯,其只需向着满足条件大方向搜索,直到不满足条件为止。这里不再详细讲解算法的定义等理解性的东西,而是通过分析几个例题,得出解这类题目的模板。 岛屿数量 给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 输入: 11110 11010 11000 00000 输出: 1 输入: 11000 11000 00100 00011 输出: 3 很明显该题是搜索类的问题,而且不需要把每一项都枚举出来,因此可考虑dfs,特别是矩阵类的dfs,套路很固定,首先,需要定义四个方向,即每个位置的上下左右,对每个方向都进行判断是否满足继续向下搜索的条件,如果满足,那么就调用dfs递归函数进行递归调用,同时在进行每个方向选择时需要注意下个位置是否已经遍历过,因此,一般会需要一个额外的数组来存储某个位置是否已经被调用过,不过这道题显然可以不是使用额外数组

棋盘问题(dfs)

心不动则不痛 提交于 2020-01-26 23:02:09
【题目描述】 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 k 个棋子的所有可行的摆放方案 C。 【输入】 输入含有多组测试数据。 每组数据的第一行是两个正整数n,k,用一个空格隔开,表示了将在一个n×n的矩阵内描述棋盘,以及摆放棋子的数目。 (n≤8,k≤n) 当为−1−1时表示输入结束。 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域,. 表示空白区域(数据保证不出现多余的空白行或者空白列)。 【输出】 对于每一组数据,给出一行输出,输出摆放的方案数目C(数据保证C<231)。 【输入样例】 2 1 #. .# 4 4 …# …#. .#… #… -1 -1 【输出样例】 2 1 题目分析: 当k<n时每一行不必都摆放棋子,可以空出几行。所以可以分行搜索。 代码: # include <iostream> # include <cstring> using namespace std ; int n , k , pan [ 10 ] [ 10 ] ; //记录棋盘情况 int sum = 0 ; //情况数 int b [ 101 ] ; //判断该列可不可用 char s ; void search ( int , int ) ;

2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)

人走茶凉 提交于 2020-01-26 19:34:14
2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题目链接:http://codeforces.com/contest/589 I题:水题签到。 #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; typedef long long ll; const int maxn=1000100; const int INF=(1<<29); int cnt[maxn]; int n,k,a; int main() { //freopen("in.txt","r",stdin); while(cin>>n>>k){ MS0(cnt); REP(i,1,n) scanf("%d",&a),cnt[a]++; int x=n/k,ans=0; REP(i,1,k){ ans+=abs(cnt[i]-x); } cout<<ans/2<<endl; }

二分图多重匹配

萝らか妹 提交于 2020-01-26 18:17:11
二分图多重匹配 一般的二分图匹配与多重匹配之间的区别就是: 二分图多重匹配:右边的物品可以和多个左边的相匹配,同时右边的物品可以有一个最大匹配容量V[i] int cnt [ maxn ] , V [ maxn ] ; //cnt[i]记录现在第i个星球有多少个人,V[i]记录i星球的容量 int linker [ maxn ] [ 15 ] ; //linker[i][j]表示第i个星球第j个匹配的人是谁 bool dfs ( int u ) { for ( int i = 1 ; i <= m ; i ++ ) { if ( mapp [ u ] [ i ] && ! vis [ i ] ) //表示第u个人可以匹配第i个星球 { vis [ i ] = 1 ; if ( cnt [ i ] < V [ i ] ) //并且该星球人数未上限,直接匹配 { linker [ i ] [ cnt [ i ] ++ ] = u ; return true ; } for ( int j = 0 ; j < V [ i ] ; j ++ ) { if ( dfs ( linker [ i ] [ j ] ) ) //可以让位置 { linker [ i ] [ j ] = u ; return true ; } } } } return false ; } bool solve ( )

树链剖分

本秂侑毒 提交于 2020-01-26 16:41:14
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入 第一行包含4个正整数N、M、R、P,分别表示树的结点个数、操作个数、根节点序号和取模数(即所有的输出结果均对此取模)。 接下来一行包含N个非负整数,分别依次表示各个节点上初始的数值。 接下来N-1行每行包含两个整数x、y,表示点x和点y之间连有一条边(保证无环且连通) 接下来M行每行包含若干个正整数,每行表示一个操作,格式如下: 操作1: 1 x y z 操作2: 2 x y 操作3: 3 x z 操作4: 4 x 输出 输出包含若干行,分别依次表示每个操作2或操作4所得的结果(对P取模) 样例输入 5 5 2 24 7 3 7 8 0 1 2 1 5 3 1 4 1 3 4 2 3 2 2 4 5 1 5 1 3 2 1 3 样例输出 2 21 提示 对于100%的数据:N<=100000,M<=100000 输入的每一个数均小于2147483647 重儿子:siz[u

interview problems

自古美人都是妖i 提交于 2020-01-26 09:19:30
2018.1.10.1 Eat Cheese I 房间里有多块奶酪(x,y),小老鼠一开始在(0,0),问小老鼠吃掉所有奶酪要走的最短距离。 dfs + 剪枝。 #include <iostream> #include <vector> #include <math.h> #include <limits.h> using namespace std; double eatCheese(vector<pair<double, double>>& cheeses); void dfs(int len, vector<pair<double, double>>& cheeses, double sum, pair<double, double>& start, double& ans, vector<bool>& visit); int main() { vector<pair<double, double>> v; v.push_back(pair<double, double>(1.0, 1.0)); v.push_back(pair<double, double>(2.0, 2.0)); v.push_back(pair<double, double>(3.0, 3.0)); cout << eatCheese(v) << endl; return 0; } double

floodfill问题——岛屿的最大面积

南楼画角 提交于 2020-01-26 03:51:12
文章目录 floodfill问题——岛屿的最大面积 问题描述 思路 代码 扩展 floodfill问题——岛屿的最大面积 问题描述 题目来自Leetcode695题 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。) 示例 1: [[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] 对于上面这个给定矩阵应返回 6。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。 示例 2: [[0,0,0,0,0,0,0,0]] 对于上面这个给定的矩阵, 返回 0。 注意: 给定的矩阵grid 的长度和宽度都不超过 50。 思路 对于这类问题,都是基于以下思路,遍历二维数组

围棋程序

旧城冷巷雨未停 提交于 2020-01-25 22:58:53
Description 小A喜欢围棋,这天他心血来潮想要设计一个围棋小游戏,但是一个基本的问题是:该如何计算闭合线段围成的面积呢? 比如在下面这个5*5的由“0 1”组成棋盘中,由“1”围出来的“0”的面积是:3。 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 规定:面积的计算方法是统计“1”所围成的闭合曲线中水平线和垂直线交点的数目,特别地,在边上的0不被计算,如第3行第5列的“0”不算作面积。 Input 一个10*10的棋盘矩阵,棋盘中每个点由0、1组成。 Output 由题意输出1围成的0的面积。 Sample Input 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 Sample Output 12 1 #include<iostream> 2 //#include<fstream> 3 using namespace std; 4 int a[100][100]; 5

Does changing the value of dfs.blocksizeaffect existing data

随声附和 提交于 2020-01-25 20:37:11
问题 My Hadoop version is 2.5.2. I am changing my dfs.blocksize in hdfs-site.xml file on the master node. I have the following question: 1) Will this change affect the existing data in HDFS 2) Do I need to propogate this change to all he nodes in Hadoop cluster or only on the NameNode is sufficient 回答1: you should be making changes in hdfs-site.xml of all slaves also... dfs.block size should be consistent accross all datanodes. 回答2: 1) Will this change affect the existing data in HDFS No, it will