![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【树/生成树】
张松超
这个作者很懒,什么都没留下…
展开
-
PAT ~ L2-006. 树的遍历(树的遍历互求 + 层次遍历)
思路:首先我们要明确二叉树遍历的三种方法:1.先序遍历(PreOrdee):根,先序遍历左子树,先序遍历右子树2.中序遍历(InOrder):中序遍历左子树,根,中序遍历右子树3.后序遍历(PostOrder):后序遍历左子树,后序遍历右子树,根我们知道由中序遍历+先序/后序遍历就可以得到唯一的二叉树,而由先序+后序得到的二叉树不唯一。由先序或后序我们可以得到当前树的根节点,然后有中序遍历确定左子...原创 2018-03-15 15:57:27 · 672 阅读 · 0 评论 -
POJ ~ 3026 ~ Borg Maze (BFS预处理 + 最小生成树)
题意:在一个M行N列的迷宫中(看下样例别弄反了),‘#’表示墙不可以走,其他都可以走,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母A,输出这条路径L的总长度。AC是AC了,但是我依旧没看懂样例是咋来的。。。思路:先把所有A,S点编号,用BFS处理出来A,S中每一个点到剩余所有点的最短路径长度,然后以A,S为点,A到S的最短路径长度为边权建立一个新图,最后对于这个新图...原创 2018-01-24 18:38:11 · 383 阅读 · 0 评论 -
POJ ~ 1287 ~ Networking (最小生成树)
题意:N个点M条边,M行每行u,v,w表示有一条u-v的边边权为w,使N个点都连通的最小花费。思路:kruskal模板题。 //#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<algorithm>using namespace std;cons...原创 2018-01-23 17:39:29 · 320 阅读 · 0 评论 -
POJ ~ 1679 ~ The Unique MST (次小生成树)
题意:T组测试数据,有N个点M条边,问最小生成树是否唯一?唯一输出权重,不唯一输出“Not Unique!”。思路:求次小生成树。其实求法很简单,就是记录一下最小生成树用的边,然后尝试删去这些边中的某一条边,然后再求最小生成树。数据有点坑,代码下面附3组数据。 //#include<bits/stdc++.h>#include<iostream>#in...原创 2018-01-24 14:51:24 · 261 阅读 · 0 评论 -
POJ ~ 1258 - Agri-Net (最小生成树)
题意:有N个点,给出邻接矩阵表示边权,求最小生成树。思路:kruskal套上就过了。 //#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int MAXN = 100...原创 2018-01-24 08:35:48 · 273 阅读 · 0 评论 -
POJ ~ 2031 ~ Building a Space Station (最小生成树)
题意:三维空间内有N个球,给你圆心坐标和半径X,Y,Z,R。问使这些球连通的需要修建路的最小距离?如果两个球不是相离的,那么认为他们已经联通。思路:只有100个点。暴力把边处理出来进行kruskal就行了,已经连通的两个星球可以把权值直接置为0,或者不建这条边,直接把这两个点合并进并查集。 边权置为0的代码: //#include<bits/stdc++.h>#...原创 2018-01-23 20:11:23 · 362 阅读 · 0 评论 -
POJ ~ 2349 ~ Arctic Network (最小生成树)
题意:输入S,N表示有N个哨所要通信,现在有S课卫星。然后输入N个点的坐标。有卫星的两个哨所之间可以任意通信(卫星是你分配的);否则,一个哨所只能和距离它小于等于D的哨所通信。求D的最小值?思路:其实就是求最小生成树,删掉S条边以后,最长的边的边权为多少?因为一定能形成最小生成树,所以我们在建立最小生成树的时候,本来需要建立N-1条边,那么现在只需要建立N-1-(S-1)条边即可。输出最后一条...原创 2018-01-24 11:15:28 · 314 阅读 · 0 评论 -
HDU ~ 1233 ~ 还是畅通工程 (最小生成树)
思路:最小生成树。。。 //#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int MAXN = 1005;const int MAXM = 1005 * 1005;int...原创 2018-01-24 08:41:52 · 279 阅读 · 0 评论 -
ZOJ ~ 1586 ~ QS Network (最小生成树)
题意:T组测试数据。有N个点需要通讯,先输入N个点的点权,然后输入N*N的邻接矩阵表示边权。两个点之间可以互相通讯的条件为两点的边权加点权。思路:先把点权输入。处理边权的时候直接把两点的点权加上,然后求一个最少生成树。 //#include<bits/stdc++.h>#include<iostream>#include<cstdio>...原创 2018-01-24 08:28:54 · 266 阅读 · 0 评论 -
POJ ~ 2421 ~ Constructing Roads (最小生成树)
题意:有N个村庄,给你一个邻接矩阵表示他们之间的距离,现在有一些路已经建好了,问你还需要建多长的路才能使这N个村庄连通?思路:最小生成树。已经有路的边的边权设置为0,从邻接矩阵中把边处理出来。 //#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<algo...原创 2018-01-23 20:27:22 · 323 阅读 · 0 评论 -
POJ ~ 1251 ~ Jungle Roads (最小生成树)
题意:给你N个点,然后有N-1行,每行先输入起点,然后输入和他有边(即可以直接到达)的点有k个,然后输入这k个点的和到他们的花费。问使这些这些点都连通的最小花费是多少?思路:最小生成树。注意输入的时候要把换行和空格给处理掉,然后把边去起来求最小生成树就可以。 //#include<bits/stdc++.h>#include<iostream>#inclu...原创 2018-01-23 19:14:41 · 341 阅读 · 0 评论 -
HDU ~ 1875 ~ 畅通工程再续 (最小生成树)
思路:注意建边的时候,距离小于等于1000且大于等于10才可以建边。需要判定下是否能够形成最小生成树。 //#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int MAX...原创 2018-01-24 09:06:50 · 303 阅读 · 0 评论 -
Codeforces ~ 1083A ~ The Fair Nut and the Best Path(树形DP,树的直径)
题意先输入N表示一棵有N个结点的树,然后输入N个点的点权,然后输入M条边。要求一条链,使得链上的∑\sum∑点权和-∑\sum∑边权和最大,输出这个最大值。思路显然是树的直径?dp[u]表示当前到u的最长链,那么ans=max(dp[u]+dp[e.v]−e.w)ans = max(dp[u]+dp[e.v]-e.w)ans=max(dp[u]+dp[e.v]−e.w),dp[u]=m...原创 2018-12-12 18:07:19 · 579 阅读 · 0 评论 -
牛客练习赛32 ~ D ~ Where are you(kruskal + 边双联通)
题目链接思路kruskal过程,我们按边权排序,然后依次加入,同时用并查集维护连通性。本题难以处理的其实是边权相同的边,我们把这些边一起考虑。假设此时最小生成树的这个森林中,我们把在一棵树(一个集合)看作一个点,以这些边权相同的边(如果这条边不太同一棵树中)建立新图,可以证明桥边一定必选。#include &lt;bits/stdc++.h&gt;using namespace s...原创 2018-12-03 18:58:35 · 254 阅读 · 0 评论 -
POJ ~ 1789 ~ Truck History (最小生成树)
题意:给你N个车牌号(字符串),两个车牌号之间的distance为这两个编号之间不同字母的个数。一个编号只能由另一个编号“衍生”出来,代价是这两个编号之间相应的distance,现在要找出一个“衍生”方案,使得总代价最小,也就是distance之和最小。思路:建图,然后跑prim或者建边跑kruskal。prim: //#include<bits/stdc++.h>...原创 2018-01-25 09:32:16 · 307 阅读 · 0 评论 -
POJ ~ 1751 ~ Highways (最小生成树 + 打印路径)
题意:N个点,给你N个点的坐标,现在还有Q条边已经连接好了。问把N个点怎么连接起来的花费的距离最短?坑点:注意多组输入输出可能会超时。本题为:Special judgeYes,只要是符合要求的正确答案即可。思路:prim或者kruskal的路径输出。①prim,已经建好的边的权值设置为0。开一个pre数组//pre[i]记录距离i最近的点。那么建立的边也就为pre[i]和i,但是i节点...原创 2018-01-25 11:19:29 · 740 阅读 · 0 评论 -
POJ ~ 2728 ~ Desert King (01分数规划 + 最小生成树)
题意多组测试数据,N等于0时结束。有N个村庄,然后N行给你每个村庄的坐标(x,y)和海拔z,连接两个村庄需要修欧几里得距离len[i][j]的路,连接海拔不同的村庄需要付出海拔差的花费cost[i][j],现在要使得他们连通起来,求最小单位花费(即最小) 题解01分数规划问题。把cost[i][j] - x*len[i][j]看成边权,然后求最小生成树即可。二分的下界显然是...原创 2018-09-20 17:50:45 · 266 阅读 · 0 评论 -
PAT ~ L2-011. 玩转二叉树 (树的遍历互求 + 交换左右节点)
思路:树的遍历互求,中序前序建树。对于交换非叶子节点的左右孩子,可以通过层序遍历的时候让右子树先入队,左子树后入队。也可以通过遍历交换之后,层序遍历即可。我采取的链表方式建树,也可以用数组模拟。右子树先入队:#include <bits/stdc++.h>using namespace std;const int MAXN = 35;int n, in_order[MAXN], ...原创 2018-03-22 21:16:15 · 307 阅读 · 0 评论 -
PAT ~ L2-004. 这是二叉搜索树吗?(树的遍历,二叉搜索树性质)
思路:太菜了,看参考别人博客才会的。我们先假设他给的这个序列就是该二叉搜索树的先序遍历,我们去进行遍历这个二叉搜索树,并处理出来它的后序遍历结果。如果遍历过程中,发现某个子树不是正好分为左右两部分(左边的值都小与根,右边的值都大于根)直接return。最后回溯过程中依次把根存入vector数组就是后序遍历结果。如果不符合前序遍历的话,因为中间有直接return的时候,所以存入vector数组中的数...原创 2018-03-13 21:40:28 · 254 阅读 · 0 评论 -
UVA ~ 679 ~ Dropping Balls (二叉树编号 + 思维)
题意:有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有节点从上到下从左到右编号为1,2,3,...,2^D-1。在结点1处放一个小球,他会下落。每个内结点上都有一个开关,初始全部关闭,每次有一个小球落到一个开关上时,状态都会改变。当小球到达一个结点时,如果该结点上的开关关闭,则往左走,否则往右走,知道走到叶子结点,如果6-2所示。一些小球从结点1处一次开始下落,最后一个小球将会落到哪里呢?...原创 2018-05-10 19:52:35 · 350 阅读 · 0 评论 -
UVA ~ 122 ~ Trees on the level (二叉树的创建 + 层次遍历)
题意:输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点都按照从根结点到他的移动序列给出(L表示左,R表示右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输入用一对空括号"()"结束(这对括号本身不代表一个结点)。注意,如果从跟到某个结点的路径上有的结点没有在输入中给出,或者给出超过一次,应当输出-1。结点个数不超...原创 2018-05-10 21:36:30 · 286 阅读 · 0 评论 -
Tree UVA - 548 (二叉树的遍历互求)
题意:给一棵点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序和后序遍历,找一个叶子使得它到跟的路径上的权和最小。如果有多解,该叶子本身的权应该尽量小。输入中每两行表示一棵树,其中第一行为中序遍历,第二行为后序遍历。【分析】后序遍历的第一个字符就是根,因此只需要在中序遍历中找到它,就知道左右子树的中序和后序遍历了。这样就可以先把二叉树构造出来,然后在执行一次递归遍历,找到最优解。提示...原创 2018-05-11 10:59:57 · 293 阅读 · 0 评论 -
UVA ~ 839 ~ Not so Mobile (二叉树的DFS)
题意:输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等,就是W1D1 = W2D2,其中W1和W2分别为左右两边砝码的重量,D1和D2为距离。采用递归方式输入:每个天平的格式为W1,D1,W2,D2,当W1或W2为0时表示该“砝码”实际是一个子天平,接下来绘描述这个子天平,接下来绘描述这个子天平。当W1=W2=0时,会先描述左子天平,然后是右子天平。思路:所有天平都平衡...原创 2018-05-11 11:24:51 · 223 阅读 · 0 评论 -
UVA ~ 699 ~ The Falling Leaves (二叉树的DFS)
题意:给一棵二叉树,每个结点都有一个水平位置:左子结点在它左边一个单位,右子结点在右边1个单位。从左向右输出每个水平位置的所有结点的权值之和。如图6-7所示,从左到右的3个位置的权和分别为7,11,3。按照递归(先序)方式输入,用-1表示空树。思路:开一个数组维护该列的和即可,DFS的过程中边输入边统计。#include<bits/stdc++.h>using namespace s...原创 2018-05-11 15:28:13 · 252 阅读 · 0 评论 -
UVA ~ 297 ~ Quadtrees (四分树)
题意:如图6-8所示,可以用四分树来表示一个黑白图像,方法是用根结点表示整幅图像,然后把行列个分城两等分,按照图中的方式编号,从左到右对应4个子结点。如果某子结点对应的取余全白或全黑,则直接用一个黑结点或者白结点表示:如果即有黑又有白,则用一个灰结点表示,并且为这个区域递归建树。给出两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数。p表示中间结点,f表示黑色(full),e表示白...原创 2018-05-11 20:54:54 · 331 阅读 · 0 评论 -
UVA ~ 10562 ~ Undraw the Trees (多叉树 + DFS)
题意:你的任务是将多叉树转化为括号表示法。如图所示,每个结点用除了“-”,“|”和空格的其他字符表示,每个非叶结点的正下方总会有一个“|”字符,然后下方是一排“-”字符,恰好覆盖所有子结点的上方。单独的一行“#”为数据结束标记。输入T组数据,每组数据以"#"结束。思路:按照DFS序打印就好了。如果不是叶子结点就找到最左边的“-”然后DFS子树。注意:该树可能为空,即该组数据只有一个‘#’,此时输出...原创 2018-05-20 11:46:39 · 235 阅读 · 0 评论 -
CodeForces ~ 982C ~ Cut 'em all! (树 + dfs)
题意:给你一棵N个结点的树,问最多剪掉多少条边之后,剩下的连通分量的size都为偶数,如果一条也没法剪掉输出-1。思路:如果N为奇数,显然没解。如果该树的一棵子树结点个数为偶数,那么就可以将它和父节点剪开。遍历整棵树,回溯过程中统计结点个数,如果为偶数,答案+1。#include <bits/stdc++.h>using namespace std;const int MAXN =...原创 2018-05-28 17:34:40 · 487 阅读 · 0 评论 -
CodeForces ~ 981C ~ Useful Decomposition (思维 + 构造)
题意:给你一棵N个结点的树,然后输入N-1条边。要求将该树拆成若干条简单路径,并且这些路径都经过一个公共节点。给出任意一个解决方案,如不存在输出No。思路:邻接表存图建双向边,如果一个点的出度>2,那么他就是那个共享的点,如果有两个共享的点,一定为NO。我们把出度为1的点,存到一个数组中。如果有共享点,直接输出:共享点~这个数组中所有的点即可。如果没有共享点,那么就是一条链的情况,输出两个出...原创 2018-05-28 18:54:30 · 341 阅读 · 0 评论 -
Codeforces ~ 1006E ~ Two Strings Swaps(dfs序 + 时间戳)
题意给你一棵以1为根节点树,然后输入2~n的父节点,Q次查询,每次询问以第u个点为根深搜到的第k个点是哪个,找不到输出-1? 思路dfs序,记录一下时间戳就好了,即进入每个点和离开每个点的在dfs序中的时间(下标)。#include<bits/stdc++.h>using namespace std;const int MAXN = 2e5 + 5;int ...原创 2018-07-17 12:11:30 · 427 阅读 · 0 评论 -
HDU ~ 2586 ~ How far away ?(LCA,树上两点最短路径)
题意T组测试数据,每组给你N,Q,然后给N-1条边(u,v,w)u-v边权为w,表示一棵树,Q次询问,每次询问a到b的最短路径。思路LCA,然后过程中记录下每个点到根节点的距离dis,dis[a] + dis[b] - 2*dis[LCA(a,b)]就是a到b的最短路径。#include &amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;const i...原创 2018-10-24 10:04:31 · 681 阅读 · 0 评论 -
UVA ~ 712 ~ S-Trees(二叉树,二进制枚举)
题意给出一棵满二叉树,每一层用一个xix_ixi的01变量来表示,xix_ixi取0往左走,取1往右走。每个叶子结点有一个值(0或1),然后有一些询问,求每个询问到达的叶子结点的值。多组测试数据,以n=0表示结束,每组先输入n表示有n层,然后输入从根到叶子每一层对应x几x_几x几那个变量,然后输入叶子结点对应的值。接下来输入Q次询问,每次询问输入一个长度为n的01串表示x1−&...原创 2019-01-06 21:33:31 · 997 阅读 · 0 评论