CF-1249 F.Maximum Weight Subset(贪心)
生活随笔
收集整理的這篇文章主要介紹了
CF-1249 F.Maximum Weight Subset(贪心)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CF-1249 F.Maximum Weight Subset(貪心)
題目鏈接
題意
在一棵樹上選一些點構成一個集合,滿足集合內任意兩點的距離大于kkk,求集合的最大權值和
思路
一共200個點,可以從最低層的點uuu開始,默認選擇這個點,然后將它距離kkk的點權值減小val[u]val[u]val[u]表示這些點不選.
這樣向上找的時候如果碰到權值為正的點,表示選擇這個點的權值更優,同時不會影響其他點
復雜度O(n2)O(n^2)O(n2)
#include <bits/stdc++.h> const int maxn = 1e5 + 5; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; using namespace std; vector<int> g[maxn]; int a[maxn], b[maxn], dep[maxn], n, k; void dfs(int u, int fa, int d) {dep[u] = d;for (auto v : g[u]) {if (fa == v) continue;dfs(v, u, d+1);} } void dfs(int u, int fa, int x, int d) {if (d > k) return;a[u] -= x;for (auto v : g[u]) {if (fa == v) continue;dfs(v, u, x, d+1);} } int main() {cin >> n >> k;for (int i = 1; i <= n; ++i) cin >> a[i];for (int i = 1; i < n; ++i) {int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}dfs(1, 0, 0);for (int i = 1; i <= n; ++i) b[i] = i;sort(b+1, b+1+n, [&](int x, int y){return dep[x] > dep[y];});int ans = 0;for (int i = 1; i <= n; ++i) {if (a[b[i]] <= 0) continue;ans += a[b[i]];dfs(b[i], 0, a[b[i]], 0);}cout << ans << endl;return 0; }總結
以上是生活随笔為你收集整理的CF-1249 F.Maximum Weight Subset(贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF-1209 F. Koala and
- 下一篇: CF-346 D. Robot Cont