首页 > [NOIP2014]联合权值
头像 __故人__
发表于 2020-09-17 19:30:50
分析 每条边的边权为 ,由于输入的图是一颗树,那么 之间有且仅有一条简单路径,所以合法的点对 中间只会有一个点。所以考虑枚举中间的节点。令 表示节点 为中间节点的权值之和,那么 。因为 ,所以可以先考虑有序点对的值最后再 就好了。所以 , 表示在 为中间点, 为当前考虑点,已 展开全文
头像 又在摸鱼的大熊猫很勤奋努力
发表于 2020-09-17 19:10:29
联合权值 题目大意: 你有一棵树,问你距离为二的节点的最大联合权值与联合权值和 分析: 找到中间的点, 然后枚举他的儿子们, 求个和, 然后再求个最大值, 好像就完了 #include <bits/stdc++.h> using namespace std; typedef long 展开全文
头像 林思艺
发表于 2020-09-17 19:16:37
题目大意: 你有一棵树,问你距离为二的节点的最大联合权值与联合权值和 分析 在巨佬的提示下得到了思路,这不就是枚举每个点作为中间点,再枚举儿子们。求一下最大值和权值和就好了啊。 #include<bits/stdc++.h> #define ll long long const int 展开全文
头像 DeNeRATe
发表于 2020-09-17 19:59:16
分析 由于本题要求联合权值之间的Dist为2他们之间刚好夹着一个点为了处理方便,我们肯定是直接枚举中间夹着的点那么,我们来考虑需要求的两个东西Max(最大联合权值)和Ans(联合权值之和) Max:对于一个点来说,以他为中心点的联合权值最大值一定是与他相连的最大值和次大值之积所以对于最大值我们就解 展开全文
头像 Dear㉿You
发表于 2020-09-20 10:59:01
分析 题目中说只有距离为2的点才能产生联合权值,让我们画画图理解一下 这个时候我们发现所有的联合权值之和其实就是以每个点为根,其所有子树的权值两两的乘积之和。假设其中一个点为j,他对答案的贡献就是当前根的出j以外的儿子的权值总和乘节点j的权值 for (int i=head[x];i;i 展开全文
头像 savage
发表于 2019-09-01 18:04:15
题目描述 无向连通图G有n个点,n-1条边。点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1。图上两点(u, v)的距离定义为u点到v点的最短距离。对于图G上的 展开全文
头像 嘻嘻嘻嘻嘻嘻嘻
发表于 2020-09-17 23:36:22
题意:算出树上长度为2的权值和最大权值分析: 长度为2的路径可以把它标识为经过某一点,那么统计和计算就简单多了,直接枚举点,然后该点的儿子就俩俩组成长度为2的路径。 #include<bits/stdc++.h> using namespace std; #define pb pu 展开全文
头像 熠丶
发表于 2020-09-18 01:09:39
做法:DFS,树的深度优先遍历 思路: 距离为2的点对有两种:1.自己的儿子们之间2.自己的父亲和自己的儿子们 对树进行一遍dfs后得出max和sum因为是求有序点对(dfs是从上到下,然而有序对也可以是从下往上),所以结果需要*2 代码 #include <bits/stdc++.h> 展开全文
头像 savage
发表于 2019-09-07 16:04:11
算法知识点: DFS,树的深度优先遍历 复杂度: 解题思路: 距离为2的点对有两种:八字形和1字形。 对于八字形:直接将当前节点的所有子节点两两配对的结果统计出来即可。这一步线性扫描一遍即可,不需要 枚举。 我们以求总和为例,求最大值类似。从前往后枚举子节点时维护变量 展开全文
头像 dilingtian
发表于 2022-11-25 15:31:47
本题不能使用常规做法树形dp,因为相互之间没有联系,无法找到动态转换方程。 所以我们换个思路,我们尝试遍历每个节点作为中转点,也可以称为根,那么它的两边的节点两两配对就可以符合题目的要求。 我们将两边的节点的权值存入一个数组中,先排序,将数组的最后两个节点相乘就是本次最大的答案,不断更新就行。而且, 展开全文