結果
| 問題 |
No.1488 Max Score of the Tree
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-04-24 17:38:55 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 18 ms / 2,000 ms |
| コード長 | 1,061 bytes |
| コンパイル時間 | 2,054 ms |
| コンパイル使用メモリ | 184,324 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-04 09:09:25 |
| 合計ジャッジ時間 | 3,347 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int main(){
int N,K;
cin>>N>>K;
vector<vector<pair<int,int>>>g(N);
for(int i=0,a,b,c;i<N-1;i++){
cin>>a>>b>>c;
a--,b--;
g[a].push_back({b,c});
g[b].push_back({a,c});
}
queue<int>bfs;
vector<tuple<int,int,int>>ki(N);
bfs.push(0);
vector<int>dist(N,1e9),leaf;
dist[0]=0;
while(bfs.size()){
int t=bfs.front();
bfs.pop();
bool ha=true;
for(auto i:g[t]){
if(dist[i.first]>dist[t]+i.second){
dist[i.first]=dist[t]+i.second;
ki[i.first]={t,i.second,0};
ha=false;
bfs.push(i.first);
}
}
if(ha)leaf.push_back(t);
}
for(int i:leaf){
int t=i;
while(t!=0){
get<2>(ki[t])++;
t=get<0>(ki[t]);
}
}
vector<int>dp(K+1);
for(int i=1;i<N;i++){
for(int j=K;j>=0;j--){
if(get<1>(ki[i])<=j){
dp[j]=max(dp[j],dp[j-get<1>(ki[i])]+get<1>(ki[i])*get<2>(ki[i]));
}
}
}
int ans=dp.back();
for(int i:leaf){
ans+=dist[i];
}
cout<<ans<<'\n';
}