結果
| 問題 |
No.1488 Max Score of the Tree
|
| コンテスト | |
| ユーザー |
nuxxpp
|
| 提出日時 | 2021-04-29 13:12:13 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 34 ms / 2,000 ms |
| コード長 | 2,013 bytes |
| コンパイル時間 | 2,842 ms |
| コンパイル使用メモリ | 162,840 KB |
| 実行使用メモリ | 81,096 KB |
| 最終ジャッジ日時 | 2024-07-08 12:13:07 |
| 合計ジャッジ時間 | 4,476 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <queue>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <bitset>
#include <set>
#include <deque>
#include <stack>
#include <atcoder/all>
using namespace std;
#define rep(i,n) for(int i = 0; i < (n); ++i)
#define rrep(i,n) for(int i = 1; i <= (n); ++i)
#define drep(i,n) for(int i = (n)-1; i >= 0; --i)
#define srep(i,s,t) for (int i = s; i < (t); ++i)
#define dsrep(i,t,s) for(int i = (t)-1; i >= (s); --i)
#define rng(a) a.begin(),a.end()
#define rrng(a) a.rbegin(),a.rend()
#define isin(x,l,r) ((l) <= (x) && (x) < (r))
int dx4[4]={1,0,-1,0};
int dy4[4]={0,-1,0,1};
using ll = long long;
using uint = unsigned;
using ull = unsigned long long;
using P = pair<int,int>;
const ll LINF = 1001002003004005006ll;
const int INF = 1001001001;
// const ll mod = 998244353;
const ll mod = 1e9 + 7;
////////////////////////////////////////////
int n, k;
int cnt[101];
struct Edge { ll to, dis; };
vector<Edge> ed[101];
ll dp[101][100005];
ll ans;
int leaf_count(int now, int from, ll t) {
if(now != 0 && ed[now].size() == 1) {
ans += t;
return cnt[now] = 1;
}
int sum = 0;
for(auto x: ed[now]) {
if(x.to == from) continue;
sum += leaf_count(x.to, now, t + x.dis);
}
return cnt[now] = sum;
}
void calc(int now, int from, int &ind) {
if(now != 0 && ed[now].size() == 1) return;
for(auto x: ed[now]) {
if(x.to == from) continue;
rep(i, k + 1) {
if(x.dis <= i) dp[ind + 1][i] = max(dp[ind][i], dp[ind][i - x.dis] + x.dis * cnt[x.to]);
else dp[ind + 1][i] = dp[ind][i];
}
ind++;
calc(x.to, now, ind);
}
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
cin >> n >> k;
rep(i, n - 1) {
int a, b, c;
cin >> a >> b >> c;
a--; b--;
ed[a].push_back({b, c});
ed[b].push_back({a, c});
}
leaf_count(0, -1, 0);
int ind = 0;
calc(0, -1, ind);
cout << ans + dp[n - 1][k] << endl;
}
nuxxpp