dfs

NameNode和SecondaryNameNode

China☆狼群 提交于 2020-02-19 12:48:25
NN和2NN工作机制 NameNode中的元数据是存储在哪里的? 首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。 这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。 但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。 nn和2nn工作机制 第一阶段:NameNode启动 (1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动

codeforces732F Tourist Reform 边双联通分量

这一生的挚爱 提交于 2020-02-18 13:04:22
网址: https://codeforces.com/contest/732/problem/F 题意: 给出一个无向图,现在要把它变成有向图,且要使得能到达城市的最少的点取最大值。 题解: 我们可以推理一下就知道了,我们令边双联通成环,然后桥边都指向最大的边双联通分量,则到达城市最少的点一定在最大的边双联通分量上(以下简称边双),那我们就先使用$tarjan$算法求出所有的边双。然后把这些边双先连成环,方向随意,然后把桥边连向最大的边双。我比较菜不会用$vector$成对边存储,所以就先用链式前向星。 我第一次实现的时候真实毒瘤,我先求出桥边,然后求边双,然后把所有的边双$dfs$连成环,然后把桥边调整方向,整个代码真的巨复杂。然后后面参考了网上大佬的题解,直接找出最大的边双,然后直接在最大的边双的任意一个点开始$dfs$,然后边的方向与$dfs$相反就可以了。码力太烂了QAQ AC代码: #include <bits/stdc++.h> using namespace std; const int N = 4e5 + 5; struct edge { int u, v, nxt; int tp; }; edge e[N << 1]; int head[N]; int dfn[N], low[N], n, m, clk; bool bri[N << 1]; int sel[N <

2019暑训第一场训练赛 |(2016-icpc区域赛)部分题解

…衆ロ難τιáo~ 提交于 2020-02-16 21:30:51
// 今天下午比赛自闭了,晚上补了题,把AC的部分水题整理一下,记录坑点并吸取教训。 // CF补题链接: http://codeforces.com/gym/101291 A - Alphabet 题目大意: 给定一字符串,问至少需要添加多少字母后,能使该字符串删掉一些字母后成为“abcdefghijklmnopqrstuvwxyz"的序列。 分析及代码: 最长上升子序列(LIS) 问题,n的规模不大,直接 DP 两重循环求解。答案为 26-最长上升子序列的长度。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { char str[100]; int dp[100]; // dp[i] 以str[i]结尾的最长上升子序列的长度 // dp[i] = max(dp[i], dp[k]+1), 0<=k<i, str[k]<str[i] int maxLen = 0; // maxLen = max(dp[i]), 0<=i<n scanf("%s", str); int len = strlen(str); for(int i=0;i<len;i++) { dp[i] = 1; for(int j=0;j<i;j++)

PTA 7-6 列出连通集 (25分)

走远了吗. 提交于 2020-02-16 18:26:37
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。 输入格式: 输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。 输出格式: 按照"{ v​1​​ v​2​​ ... v​k​​ }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。 输入样例: 8 6 0 7 0 1 2 0 4 1 2 4 3 5 输出样例: { 0 1 4 2 7 } { 3 5 } { 6 } { 0 1 2 7 4 } { 3 5 } { 6 } 解决: #include<iostream> #include<stdio.h> #include<queue> #define MAXVEX 20 #define INFINITY 65535 using namespace std; typedef struct{ int arc[MAXVEX][MAXVEX]; int numVertexes,numEdges; }MGraph; bool visited[MAXVEX]; //建立图 void CreateMGraph(MGraph &G) { cin >> G

SGU 149. Computer Network( 树形dp )

蓝咒 提交于 2020-02-16 12:17:13
题目大意:给N个点,求每个点的与其他点距离最大值 很经典的树形dp...很久前就想写来着...看了陈老师的code才会的...mx[x][0], mx[x][1]分别表示x点子树里最长的2个距离, dfs一遍得到. mx[x][2]表示从x的父亲到x的最长路径长度, 也是dfs一遍得到(具体看代码)。最后答案就是max(mx[x][0], mx[x][2]). 时间复杂度O(N) -------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 10009; int N, mx[maxn][3]; struct edge { int to, w; edge* next; } E[maxn << 1], *pt = E, *head[maxn]; void AddEdge(int u, int v, int w) { pt->to = v; pt->w = w; pt->next = head[u]; head[u] = pt++; } void Init() { scanf("%d

栈和深度优先搜索(DFS)

被刻印的时光 ゝ 提交于 2020-02-16 11:03:14
与 BFS 类似,深度优先搜索 (DFS) 是用于在树/图中遍历/搜索的另一种重要算法。也可以在更抽象的场景中使用。 正如树的遍历中所提到的,我们可以用 DFS 进行 前序遍历 , 中序遍历 和 后序遍历 。在这三个遍历顺序中有一个共同的特性: 除非我们到达最深的结点,否则我们永远不会回溯 。 这也是 DFS 和 BFS 之间最大的区别, BFS 永远不会深入探索,除非它已经在当前层级访问了所有结点 。 模版 递归模版 有两种实现 DFS 的方法。第一种方法是进行递归: boolean DFS ( Node cur , Node target , Set < Node > visited ) { return true if cur is target ; for ( next : each neighbor of cur ) { if ( next is not in visited ) { add next to visted ; return true if DFS ( next , target , visited ) == true ; } } return false ; } 当我们递归地实现 DFS 时,似乎不需要使用任何栈。但实际上,我们使用的是由系统提供的隐式栈,也称为调用栈(Call Stack)。 显式栈模板 递归解决方案的优点是它更容易实现。 但是

LuoguP3128 [USACO15DEC]最大流Max Flow (树上差分)

我的未来我决定 提交于 2020-02-15 06:40:57
跟LOJ10131暗的连锁 相似,只是对于 \(lca\) 节点把它和父亲减一 #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a)) #define nR(a,b,c) for(register int a = (b); (a) >= (c); --(a)) #define Fill(a,b) memset(a, b, sizeof(a)) #define Max(a,b) ((a) > (b) ? (a) : (b)) #define Min(a,b) ((a) < (b) ? (a) : (b)) #define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b)) #define ll long long #define u32 unsigned int #define u64 unsigned long long #define ON_DEBUGG #ifdef ON_DEBUGG #define D_e_Line printf("\n----------\n") #define D_e(x)

K-N皇后问题,回溯法、BFS、DFS,任意数量种类的皇后在棋盘上的摆放方案

两盒软妹~` 提交于 2020-02-15 00:59:12
对最大为MAX*MAX的棋盘,任意数量种的皇后,种类数量以queen记录,每种皇后的同一行,同一列,以及对角线上不能有其他同种类的皇后,一个格子只能放一个皇后棋子,计算最多摆放方案的数量,并记录在ans[][]内,输出方案数量。 判断对角线用 abs(行-行) == abs(列-列) 后续再更新优化,用二进制保存数据判断运算。 # include <iostream> # include <cmath> # include <cstring> # define MAX 13 //棋盘最大范围 # define queen 2 //两种棋 using namespace std ; int N ; int rst = 0 ; bool map [ MAX ] [ MAX ] ; int ans [ queen ] [ MAX ] ; void test ( ) { //测试数据 N = 13 ; for ( int i = 0 ; i < N ; ++ i ) { for ( int j = 0 ; j < N ; ++ j ) { map [ i ] [ j ] = 1 ; } } } void inputData ( ) { cin >> N ; for ( int i = 0 ; i < N ; ++ i ) { for ( int j = 0 ; j < N ; ++ j )

[LeetCode]547. 朋友圈(DFS)

ぃ、小莉子 提交于 2020-02-14 01:44:52
题目 班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。 给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。 示例 1: 输入: [[1,1,0], [1,1,0], [0,0,1]] 输出: 2 说明:已知学生0和学生1互为朋友,他们在一个朋友圈。 第2个学生自己在一个朋友圈。所以返回2。 示例 2: 输入: [[1,1,0], [1,1,1], [0,1,1]] 输出: 1 说明:已知学生0和学生1互为朋友,学生1和学生2互为朋友,所以学生0和学生2也是朋友,所以他们三个在一个朋友圈,返回1。 注意: N 在[1,200]的范围内。 对于所有学生,有M[i][i] = 1。 如果有M[i][j] = 1,则有M[j][i] = 1。 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/friend-circles 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 题解 给出无向图 邻接矩阵 ,求无向图的连通分支数。

hdu 1716(dfs)

雨燕双飞 提交于 2020-02-13 14:18:56
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1716 排列2 Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。 Input 每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。 Output 对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数间用空格分隔。 每组输出数据间空一行,最后一组数据后面没有空行。 Sample Input 1 2 3 4 1 1 2 3 0 1 2 3 0 0 0 0 Sample Output 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321 1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211 1023 1032 1203 1230 1302 1320 2013 2031 2103 2130 2301 2310 3012 3021 3102