結果
問題 | No.1488 Max Score of the Tree |
ユーザー |
![]() |
提出日時 | 2021-04-23 21:58:52 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 17 ms / 2,000 ms |
コード長 | 1,417 bytes |
コンパイル時間 | 3,401 ms |
コンパイル使用メモリ | 198,260 KB |
最終ジャッジ日時 | 2025-01-20 23:50:28 |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 29 |
ソースコード
#include <bits/stdc++.h>using ll = long long;using namespace std;int y = 0;struct Graph {struct Vertex { int n, x, c; };struct Edge { int i, n, c; };Graph(int n, int m) : v(n, { -1, 0, 0 }), e(m), n(n), m(0) {}void add_edge(int a, int b, int c) {e[m] = { b, v[a].n, c };v[a].n = m;m++;}int dfs(int i, int p) {int x = 0;for (int j = v[i].n; j >= 0; j = e[j].n) {Edge &o = e[j];if (o.i == p) continue;v[o.i].c = o.c;x += dfs(o.i, i);}if (x == 0) x = 1;y += x * v[i].c;return v[i].x = x;}void solve(int k) {//最初のi個を使って長さがl以下のときの最大価値 価値はc*xvector<int> dp(k + 1, 0);for (int i = 1; i < n; i++) {int t = v[i].c, s = v[i].c * v[i].x;for (int l = k - t; l >= 0; l--) {dp[l + t] = max(dp[l + t], dp[l] + s);}}cout << y + dp[k] << endl;}vector<Vertex> v;vector<Edge> e;int n, m;};int main() {int n, k;cin >> n >> k;Graph g(n, (n - 1) * 2);for (int i = 0; i < n - 1; i++) {int a, b, c;cin >> a >> b >> c;a--; b--;g.add_edge(a, b, c);g.add_edge(b, a, c);}g.dfs(0, -1);g.solve(k);return 0;}