题:https://codeforces.com/contest/1249/problem/F 题意:给一颗树,边权为1,节点有点权,问取到一个点集,俩俩之间路径超过k,是点权和最大 思路:贪心地取点,先将点按照深度经行排序,每一次,取一个点权大于0的点,然后对于这个点bfs出去的路径小于k的点减去当前点的a[u],然后将a[i]加入到ans中 #include<bits/stdc++.h> using namespace std; #define fo(i,a,b) for(int i=a;…
题意 在一颗有点权的树上,选若干个点,使得这些点两两距离大于k,且点权和最大 思路 贪心的取比较大的值即可 将所有点按照深度从大到小排序,如果当前点点权\(a[i]\)大于0,则将距离为k以内的所有点减\(a[i]\) 代表取了当前点,为答案贡献\(a[i]\) 如果下面又扫到大于零的点权,说明那个点比这个大,于是取那个 复杂度\(O(n^2)\) 代码 int n,k; int a[maxn],b[maxn]; vector<int>v[maxn]; int ans; int dep[max…
传送门 设 $f[x][i]$ 表示 $x$ 的子树中,离 $x$ 最近的选择的节点距离为 $i$ 的合法方案的最大价值 设 $val[x]$ 表示节点 $x$ 的价值,首先有 $f[x][0]=val[x]$ 那么考虑子树的合并,有 $f[x][min(i,j+1)]=max(f[x][min(i,j+1)],f[x][i]+f[v][j])$ 注意此时 $f[x][i]$ 不能包括 $v$ 的贡献,这个可以搞个 $tmp$ 存一下新的 $f[x]$,最后统一覆盖掉即可 然后答案就是 $f[r…
CF1249F Maximum Weight Subset 洛谷评测传送门 题目描述 You are given a tree, which consists of nn vertices. Recall that a tree is a connected undirected graph without cycles. Example of a tree.Vertices are numbered from 11 to nn . All vertices have weights, the…
目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大独立集:  对一个图选出尽量多的点组成一个集合,满足这些点之间没有边相连.所有独立集中,顶点数最多的称作最大独立集. 最小点覆盖:  对一个图选出尽量少的点组成一个集合,满足图中所有的边均有端点属于这个集合.所有覆盖集中,顶点数最少的称作最小点覆盖. 最小支配集:  对一个图选出尽量少的点组成一个集合,满足图…
题意:给定一棵n个点带点权的树,要求从中选出一个点集,使得这些点两两之间距离都大于K,求最大点权和 n,K<=2e2,1<=a[i]<=1e5 思路:树形DP显然可做,极限是n方,然而贪心也是,还比dp好写 可以用寒假camp里cls差不多的想法 从深度大的向上贪心,暴力维护对答案的贡献,即如果贡献大于0就取,并将距当前点距离<=K的贡献减去当前点 评论区甚至有红名大佬做到了线性复杂度 #include<bits/stdc++.h> using namespace st…
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d. 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时…
第一问就是Σ(deg[u]-1)/2+1 第二问是二分,判断的时候考虑第一问的贪心规则,对于奇度数的点,两两配对之后一条延伸到上面:对于欧度数的点,两两配对或者deg[u]-2的点配对,然后一条断在这个点,一条延伸上去,按这个树形dp判断一下即可 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=…
已经写过本题用二分图的做法,见这儿. 本题的图是一棵树,求最小点覆盖也可以用树形DP的做法. 定义状态f[0/1][u]表示以u为根的子树,u选取/不选最少需要选取多少点来覆盖. 显然 f[0][u] = Sigma{f[1][v]},f[1][u] = Sigma{min(f[0][v],f[1][v])}+1 ( < u,v > 属于G且v!=u.father) #include<iostream> #include<cstdio> #include<cstr…
题目链接: http://codeforces.com/contest/1249/problem/F 题意: 一棵树的每个节点有个权值,选择一个节点集,使得任意点对的距离大于$k$ 求最大节点集权值,节点集权值为节点集中节点权值和 数据范围: $1\leq n \leq 200$ $1\leq k \leq 200$ 分析: 定义$dp[v][i]$,代表在$v$这颗子树中,被选择的点最小深度恰好是$i$的最大答案 初始状态$dp[v][0]=a[v]$,这是没有子树的情况,然后再逐个添加子树…