![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树/图有关的各种经典问题
Anxdada
多读书多看报, 少吃零食多睡觉
展开
-
LA -- 3902 Network 【思维 + 遍历树的基本操作】
传送门 //题意: 给定一棵树, 原始只有一个服务器, 它最大可以覆盖到距离它k的叶子结点. 问最少需要添加几个服务器使得树上的叶子结点都能被覆盖. //思路: 通常来说, 把无根树变成有根树会有助于解题!!! 再说这道题有天然的根. 那么操作就是从根节点开始遍历, 遇到是叶子结点的且没有没被初始服务器覆盖到的保存在相应的对应深度的vector中, 然后取深度最深的那个结点的第k级祖先作为要安装原创 2017-08-16 21:42:59 · 408 阅读 · 0 评论 -
HDU - 6178 Monkeys 【树上的最大匹配 + 读入挂优化】
传送门 //题意: 给定一个树, 每个结点上可以占据一个猴子, 问最少留下多少条边使得k个猴子都占据一个结点, 并且每个猴子必须都要有另外一个有猴子的结点和他相连才行. //思路:简单的说就是,总是先满足一条边占据两个猴子是最优的, 然后这类边占据完了后, 在多一个猴子就需要再多一条边即可. 这个就是树上的二分匹配, 建图跑二分匹配肯定不行, 所以用树形dp, 或者贪心的方法On可求出最大匹配...原创 2017-10-12 00:05:39 · 373 阅读 · 0 评论 -
CodeForces - 786B Legacy 【思维最短路 and 线段树优化建图】
传送门 题意: 有n个点, q次操作, 操作有三种: 1 u v w 表示u -> v 有有一条权值为w的边. 2 u l r w 表示 u 到 下标在[l, r] 的城市 有一条权值为w的边 3 u l r w 表示 下标在[l, r] 的城市 到 u 有一条权值为w的边 然后求给出起点s, 输出s到每一个点的最小花费. 不能到达输出-1.思路: 很明显直接暴力建边, 建的过...原创 2018-05-24 10:11:15 · 525 阅读 · 0 评论 -
HDU - 5669 Road 【线段树优化建图 and 思维类dp最短路】
传送门 题意: q次描述, 每次描述给出两个区间 a b 和 c d, 表示这里存在一条路在节点 (x,y)之间 ,a ≤ x ≤ b,c ≤ y ≤ d. 权值给出, 问1到n的最短路是多少, 其中你可以使用不超过k次的技能, 每使用一次, 那么你使用的那条道路的权值可以不进行累加, 即该条道路权值为零. 思路: 这道题很明显的线段树优化建图了, 具体建图方法可以参照我另一篇博客 一样的建...原创 2018-05-24 13:47:18 · 431 阅读 · 0 评论 -
HDU 4126 and HDU 4756 【求最小生成树的最佳替换边】经典题
HDU - 4126 和 HDU - 4756 基本是一样的题, 前面是后面那道的简化版这两道题主要涉及的一个问题就是, 每次替换掉图中的一条边, 问此时图的最小生成树是多少.. 很明显有个暴力的方法, 但是这样时间爆炸, 我们可以这样想, 先求一次图的最小生成树, 如果替换的边不是树边, 那么此时的图的MST依旧不会变, 如果是树边, 很明显, 我们需要在原图中找一条不是树边, 并且尽量...原创 2018-07-17 18:10:15 · 506 阅读 · 0 评论 -
HDU 6370 Werewolf 【推导 + 反向建图】 有趣的题
传送门题意: 背景狼人杀, 不过场上的人只有两种身份, 一种是狼人, 一种是村民, 每个人知道其他人的身份, 村民只说真话, 狼人可能说真话, 现在给定这些人说的话, 问一定能确定身份为狼人和村民的各有多少个人,证明: 证明的话我就用bestcoder的吧, 写的很好, 我就不详细说了. 首先,“所有人都是狼人”是合法的,所以第一个答案一定是0。 那么我们的任务就是确认有多...原创 2018-08-09 10:36:35 · 396 阅读 · 0 评论 -
树的最小支配集, 最小点覆盖, 最大独立集, 重心, 直径, 以及树上最大匹配
学习连接 先讲定义:最小支配集 对于图G = (V, E) 来说,最小支配集指的是从 V 中取尽量少的点组成一个集合, 使得 V 中剩余的点都与取出来的点有边相连.也就是说,设 V’ 是图的一个支配集,则对于图中的任意一个顶点 u ,要么属于集合 V’, 要么与 V’ 中的顶点相邻. 在 V’ 中除去任何元素后 V’ 不再是支配集, 则支配集 V’ 是极小支配集.称G 的所有支配...原创 2018-08-14 15:48:27 · 468 阅读 · 0 评论 -
AtCoder ARC061Eすぬけ君の地下鉄旅行 / Snuke's Subway Trip 【拆点最短路 + 思维】 好题!
传送门 题意: 有一个n个点m条边的无向图, 边上有一个编号, 表示这条边归编号公司管理, 如果相邻的两条边的编号相同, 则代价为0. 否则代价加1, 其实为1, 问1到n的最低代价为多少.思路: 这道题的思路真的是秒啊!!! 很明显我们要解决的问题就是如果让相同公司之间的花费为0, 所以我们进行拆点, 将u v c, 拆成u - uc, uc - vc, vc - v, 边权分别是1, 0...原创 2018-08-21 10:49:03 · 639 阅读 · 0 评论 -
洛谷P2921 Trick or Treat on the Farm 【思维 + 对图的一些操作】
传送门 题意: 给出每个编号下一个要到达的编号, 问最后每个标号可以到达的编号数量(具体可以看样例)思路: 很明显有环的情况需要考虑, 所以实际上这是一副链环的有向的非联通图, 有自环的情况. 所以我们有先把链的情况删掉, 然后统计出每个环的大小, 然后再次累加到那些链的上面就行了. 就按照这个实现即可. 具体细节还要自己思考下…AC Codeconst int maxn = 1...原创 2018-09-11 16:38:54 · 252 阅读 · 0 评论 -
【(完全)K分图的判定】
描述: 对于一个无向图, 如果能划分成若干(k)个集合, 使得任意两个同一集合内的点之间没有边相连, 任意两个不同集合内的点之间有边相连, 则称该图为完全k分图, 现在就是对于给定的一个图进行判断k是多少. (n <= 1e3)思路: 我们对于原图的补图进行并查集维护, 如果两个点之间没有边, 则他们一定在同一个集合内, 因为如果不在同一个集合, 但是他们之间已经没有边了, 一定不满足先...原创 2018-09-09 21:43:30 · 1896 阅读 · 0 评论 -
2018徐州网络预选赛 J 题 Maze Designer 【思维 + 最大生成树 + LCA】
传送门 题意:给定一个n*m的矩阵, 除了边界, 其他相邻的边都有一个代价, 现在我们需要在这个矩形中选择一些边封起来, 代价就是开始输入的代价, 我们要让封起来的代价和尽量的小, 并且封起来后, 矩阵中任意两点之间的最短路径是唯一的, 现在不告诉你具体是怎样封的(但是这个矩形已经进行了封墙的操作), 然后q个询问, 每次询问两个点, 他们在这个已经处理过的矩形中的最短路径是多少.思路: 其...原创 2018-09-10 12:43:52 · 287 阅读 · 1 评论 -
洛谷 P2279 树上k距离覆盖问题【贪心 + 思维】
传送门题意: 给定一颗树, 若在i点安放了一个消防站, 那么在树上距离它不超过2的所有点都可以被照顾到, 那么要让整棵树都要照顾到最少需要安放多少个消防站,思路: 贪心, 就是找最深没被覆盖到的点, 并在它的祖父处设一个消防站. 考虑到这个点的所有子孙后代都已经被覆盖了, 因此这时覆盖祖父能盖到更多额外的点, 并保证结果不会更差.我们在输入时只要预处理出深度(边输入边处理)并排序, 碰到已覆...原创 2018-10-06 19:34:35 · 2585 阅读 · 0 评论 -
HDU 6446 Tree and Permutation【思维】好题!
传送门题意: 给定一个n, 那么1-n是一个排列, 定义某个排列(x y z)的值为x - y, x - z在树上的最短距离和, 求这个排列的全排列的值相加等于多少, 树的形态会给出.思路: 算边的贡献, 首先对于任意一个排列, 它是树上某点到其他点的距离之和, 然后由于全排列, 实际上就是树上任意两点之间的距离之和(考虑顺序), 首先树上任意两点之间的和我们会求(考虑每条边的贡献, 即边的两...原创 2019-03-19 14:58:10 · 204 阅读 · 0 评论 -
树的重心 poj - 1655 和 poj - 3107
首先知道 树的重心定义为: 找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 实际上树的重心在树的点分治中有重要的作用, 可以避免N^2的极端复杂度(从退化链的一端出发),保证nlogn的复杂度, 利用树型dp可以很好地求树的重心. 但是贪心的写法更好写 也更好理解, 正确性也可保证, 所以用贪心好乐..poj - 1...原创 2017-10-10 21:47:07 · 368 阅读 · 0 评论 -
POJ - 3140 Contestants Division 【水题 + 思维】
传送门 //给定一棵树,问删除那条边后使得剩下的两个部分的val值差值最小, 每个点都有个点权. //思路: 直接枚举删边, 然后取最小值即可.AC Codeconst int maxn = 1e5+5;int cas=1;ll sum,dp[maxn],res;int cnt,head[maxn];struct node{ int to,next;}e[maxn*10];v原创 2017-10-12 19:24:22 · 487 阅读 · 0 评论 -
UVALive 6436 The Busiest City 【思维 + 树形dp想法】
传送门 // 题意: 给定一颗树, 定义一个点的繁荣度为经过这个点的路径的条数, 求这棵树的最大繁荣度为多少. 注意叶子结点路径数为0.// 思路: 我们首先要知到一个节点的繁荣度怎么算, 它 = 该节点的所有子树之间(size大小)两两相乘再相加的答案, 不要因为一次dfs而算不出其他子树的大小而困扰, 那是因为你没想到这是一棵树, 所以我们直接用总节点数减去该子树的大小就是剩余没算的节点个数原创 2018-01-13 19:19:29 · 351 阅读 · 0 评论 -
prufer数列学习笔记
学习学习, 先占坑原创 2018-01-06 21:41:58 · 414 阅读 · 0 评论 -
POJ 2377 Bad Cowtractors 【最大生成树】
传送门 // 题意: 给定一幅无向图, 求最大生成树.// 思路: 事实证明prim和kruskal算法求小的反过来求大的即可!这里用的kruskal, 从大到小排序. AC Codeconst int maxn = 1e3 + 5;const int maxm = 1e5 +5;int cas=1;struct node { int u, v, w; bool opera原创 2018-01-31 19:41:36 · 274 阅读 · 0 评论 -
判断图中是否存在环的板子
这个是判断有向图是否存在环的板子: (比较重要, 很多有向图的题中都要用)int vis[maxn];vector<int>g[maxn];bool cycle(int u) { // 有环返回true, 否则返回false. if (vis[u] == 1) return true; if (vis[u] == 2) return false; ...原创 2018-02-01 00:17:26 · 337 阅读 · 0 评论 -
POJ 2263 Heavy Cargo 【最小瓶颈路相关】
传送门 // 题意: 给定一个无向图(n, m),在给定一个起点和终点, 问地点和终点中可能路径中的最大的那条边的权值是多少.// 思路: 这个问题还是比较经典, 很多题都要这个问题, 那么我们看这个数据范围, 200,可以跑floyd, 得出任意两点之间的距离的最大的边, 就是对floyd进行一些小的膜改. 首先初始化矩阵是我们应该同一点初始化为inf, 不同点初始化为0, 然后0代表不能到达,原创 2018-01-25 15:24:20 · 305 阅读 · 0 评论 -
POJ 1797 Heavy Transportation and POJ - 2253 Frogger【边权最大问题】
POJ1797 传送门 // 题意: 求1 到 n 的可能路径中边权最大的那个边权值. // 思路: 这道题像是poj2263的加强版, 点由1000, 这次跑floyd肯定是不行的. 所以我们用并查集的方法. 并查集这个方法就很好啦~. 我们把边的信息按从大到小的排个序, 然后从大到小的选边并把他们并起来, 如果在某次并的过程中, 我们可以发现1 和 n 已经并在一起了, 那么此时的边原创 2018-01-25 15:32:53 · 237 阅读 · 0 评论 -
HDU 1598 find the most comfortable road 【暴力枚举 + 并查集】
传送门 // 题意: 给定一个无向图(n, m),每条路上面有边权, 每次询问一个起点和终点, 问从起点到终点所有路径中该条路径中边权最大的和最小的差值最小是多少.// 思路: 比较明显的是求最小和最大并且st - ed 联通. 那么首先有并查集, 其次就是我们选择的这两条边还必须是在同一条路径上的, 然而我们按边升序排序后并不能很好的保证该点, 但是我们我们可以知道如果我们枚举的这两条边不是在原创 2018-01-29 13:48:08 · 290 阅读 · 0 评论 -
CodeChef - AMR16E Black Money Island 【并查集 + 思维】
传送门 // 题意: 给定一幅无向带权图(n, m), 给定一个确定权值x, 问在图中是否可以构造出一颗权值为x的生成树. 并且边权一定是A or A + 1.思路: 我们首先每条边先减去A, 那么就变成了一幅01图, 然后预处理做一次生成树算出至少需要1的数量, 所以我们用并查集维护这颗树, 并且要先连接权值为0的边, 再连接权值为1的边并保存下来, 预处理完后, 每一次询问我们先初理出x, 此原创 2018-02-24 13:13:39 · 412 阅读 · 0 评论 -
2015 年 蓝桥杯 A 组 C/C++ 第十题 灾后重建 【最小生成树 + LCA倍增 + 线段树维护区间max】
交题地址 详细复杂度做法解释 这是hard版本的. AC Codeconst int maxn = 5e4+5;const int maxm = 2e5 + 5;int up[maxn][23], maxx[maxn][23];int deep[maxn], dis[maxn];int cnt, head[maxn];int n, m, q;struct node { in原创 2018-03-11 15:29:11 · 1333 阅读 · 0 评论 -
HDU 5242 Game 【树上贪心 + 思维】
传送门 // 题意: 给定一颗有根有向树. 然后同时k次从1出发, 每个点有点权, 问最多可以获得多少点权, 每个点的点权只能被获得一次.// 思路: 很明显, 如果我们正着从1开始走, 那么遇到分岔路的话, 就不能决定往哪个方向走了, 所以我们想反向建树, 然后从每个叶结点往根节点走,这样路径就是唯一的, 然后把每条路径的点权和存下来, 排一个序, 又从路径值最大的那个点开始走, 这个时候我们就原创 2018-03-19 18:44:04 · 402 阅读 · 0 评论 -
LeetCode 834 Sum of Distances in Tree
传送门题意: 给定一棵树, 输出每个点到其他点的距离之和.思路: 首先我们先dfs一遍, 存下每个点的子节点数(包括自己), 和一个值称dp, dp[u] 表示u的所有子节点到u的距离之和, 那么很容易也可以在第一次dfs中维护, 那么此时dp[0] (假设0是根节点), 就是0的答案, 那么其他的答案了, 实际上可以通过父亲的ans来转移, 此时ans[0] = dp[0], 那么假设0的字...原创 2019-03-19 15:04:46 · 280 阅读 · 0 评论