結果
問題 | No.417 チューリップバブル |
ユーザー |
![]() |
提出日時 | 2021-05-28 07:23:41 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 487 ms / 2,000 ms |
コード長 | 2,995 bytes |
コンパイル時間 | 2,201 ms |
コンパイル使用メモリ | 206,812 KB |
最終ジャッジ日時 | 2025-01-21 18:52:48 |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 40 |
ソースコード
#include<bits/stdc++.h>#define int llusing namespace std;#define ALL(x) begin(x),end(x)#define rep(i,n) for(int i=0;i<(n);i++)#define debug(v) cout<<#v<<":";for(auto x:v){cout<<x<<' ';}cout<<endl;#define mod 998244353using ll=long long;const int INF=1000000000;const ll LINF=1001002003004005006ll;int dx[]={1,0,-1,0},dy[]={0,1,0,-1};template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}struct IOSetup{IOSetup(){cin.tie(0);ios::sync_with_stdio(0);cout<<fixed<<setprecision(12);}} iosetup;template<typename T>ostream &operator<<(ostream &os,const vector<T>&v){for(int i=0;i<(int)v.size();i++) os<<v[i]<<(i+1==(int)v.size()?"":" ");return os;}template<typename T>istream &operator>>(istream &is,vector<T>&v){for(T &x:v)is>>x;return is;}// graph template// ref : https://ei1333.github.io/library/graph/graph-template.cpptemplate<typename T=int>struct Edge{int from,to;T w;int idx;Edge()=default;Edge(int from,int to,T w=1,int idx=-1):from(from),to(to),w(w),idx(idx){}operator int() const{return to;}};template<typename T=int>struct Graph{vector<vector<Edge<T>>> g;int V,E;Graph()=default;Graph(int n):g(n),V(n),E(0){}size_t size(){return g.size();}void resize(int k){g.resize(k);}inline const vector<Edge<T>> &operator[](int k)const{return (g.at(k));}inline vector<Edge<T>> &operator[](int k){return (g.at(k));}void add_directed_edge(int from,int to,T cost=1){g[from].emplace_back(from,to,cost,E++);}void add_edge(int from,int to,T cost=1){g[from].emplace_back(from,to,cost,E);g[to].emplace_back(to,from,cost,E++);}void read(int m,int pad=-1,bool weighted=false,bool directed=false){for(int i=0;i<m;i++){int u,v;cin>>u>>v;u+=pad,v+=pad;T w=T(1);if(weighted) cin>>w;if(directed) add_directed_edge(u,v,w);else add_edge(u,v,w);}}};signed main(){int N,M;cin>>N>>M;vector<int> A(N);cin>>A;Graph<int> G(N);rep(i,N-1){int u,v,c;cin>>u>>v>>c;G.add_edge(u,v,c);}vector<vector<int>> dp(N,vector<int>(M+1,0));function<void(int,int)> rec=[&](int pre,int cur){for(auto &e:G[cur])if(pre!=e){rec(cur,e);vector<int> ndp(M+1,0);for(int i=0;i<=M;i++){for(int j=0;i+e.w*2+j<=M;j++){int nx=i+e.w*2+j;chmax(ndp[nx],dp[e][j]+dp[cur][i]);}}rep(i,M+1) chmax(dp[cur][i], ndp[i]);}rep(i,M+1) dp[cur][i]+=A[cur];};rec(-1,0);cout<<*max_element(ALL(dp[0]))<<endl;return 0;}