随笔分类 -  树上问题

摘要:算法要素:二叉树的中序&前序遍历+区间dp 思路分析: 二叉树中序遍历的顺序是:左->根->右 因此对于原题目给出的区间$(1,n)\(,其根节点一定在\)(1,n)$上。 同时,二叉树具有合并的性质,即不断合并子节点可以得到最终的根节点, 而区间dp也是通过不断地合并区间得到最终的答案$dp[1] 阅读全文
posted @ 2021-11-04 23:08 Mint-hexagram 阅读(205) 评论(0) 推荐(0)
摘要:洛谷P3478 [POI2008]STA-Station 10min80分 20min100分 调的很快 算法要素:树形dp 换根dp可以处理的问题: 求出一棵树以每一个点为根节点之后,树的最大深度和 算法流程: (1)以1或其他任意一个节点为根,dfs遍历一次处理出dep (2)再dfs一次处理d 阅读全文
posted @ 2021-10-26 09:26 Mint-hexagram 阅读(38) 评论(0) 推荐(0)
摘要:这道题调了快2h,因为一个极其愚蠢的错误 算法要素:kruskal+倍增LCA+同步求最大值次大值 算法分析: 基本思路: 首先肯定要生成一个最小生成树,然后有两种枚举方式: <1>可以选择枚举生成树上每一条边 <2>枚举每一条非树边 为什么要枚举呢?显然是因为这个问题并没有明显的单调性,无法通过贪 阅读全文
posted @ 2021-10-26 08:19 Mint-hexagram 阅读(139) 评论(0) 推荐(0)
摘要:题面: 题目分析: 考虑每一条边对于答案的贡献,根据树的性质,每一条边一定将整棵树分成了两个子树,而该边的贡献=子树1中叶节点数子树2中节点总数+子树2中叶节点数子树1中节点总数。 由于树有一个重要性质: 树的任意一个点都可以作为树的根 然后?没了。 哦不是,还有一个重要的点: 要注意乘法算式过程中 阅读全文
posted @ 2021-09-22 08:18 Mint-hexagram 阅读(49) 评论(0) 推荐(0)
摘要:libreoj传送门 ###算法分析 仿照kruskal的过程,将生成树中的边按边权升序排序,将边两端点所属的点集合合并,将两个点集合中所有点向另一个点集合中连边,由于要维持最小生成树在完全图中的唯一性,则连边的边权需为e[i].w+1, 则产生的贡献为tot+=(e[i].w+1)*(cnt[e[ 阅读全文
posted @ 2021-09-08 14:06 Mint-hexagram 阅读(70) 评论(0) 推荐(0)
摘要:使用算法:kruskal构造最大生成树(森林)+倍增LCA 前置知识: kruskal模板 倍增求LCA 洛谷传送门 题意概述 一张n个点m条边的无向图,每条边边权为w,给出q个查询,查询x,y之间有无路径联通,若无路径,则输出-1,若有路径,则输出两点之间所有路径中,路径上边权最小值的最大值。 算 阅读全文
posted @ 2021-09-07 17:36 Mint-hexagram 阅读(151) 评论(0) 推荐(0)
摘要:用到的各个数组的意义 anc[i][j]表示从点i向根节点走(2^j)步到达的点的编号 dep[i]表示点i的深度 dis[i]表示点i到根节点之间的距离(i到根节点的简单路径上边的权值之和) ###算法分析: (1)题目给出了一颗无根树,因此我们建双向边,并任意选一个点作为根节点(我选择1) (2 阅读全文
posted @ 2021-09-07 08:50 Mint-hexagram 阅读(80) 评论(0) 推荐(0)
摘要:由于原来的模板在某些题目中出现了一些不可知的错误,我就把模板换了一个写法。 #include<bits/stdc++.h> using namespace std; int f[310][310]; int n,m,a,b,c,dis[310]; bool vis[310]; void prim() 阅读全文
posted @ 2021-08-23 18:23 Mint-hexagram 阅读(26) 评论(0) 推荐(0)
摘要:知识点总结。 判断树上的链 ···每个点的度数不超过二(出度与入度之和) 判断树 ···n个点,只有n-1条边 ···每两个点之间的边具有唯一性 多叉树转换成二叉树 ···第一个孩子作为左孩子,第一个孩子的兄弟作为它的右孩子 最小生成树 生成:prim or kruskal具体代码在这里 一些小性质 阅读全文
posted @ 2021-08-15 20:41 Mint-hexagram 阅读(81) 评论(0) 推荐(0)
摘要:两个月前写的模板,忘记存blog了 prim #include<cstdio> #include<algorithm> using namespace std; const int maxn=2e5+5; int n, m, f[maxn][maxn],tot,dis[maxn],s; bool v 阅读全文
posted @ 2021-08-14 16:43 Mint-hexagram 阅读(29) 评论(0) 推荐(0)