이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define pb push_back
#define ln '\n'
#define int long long
template <class _T>
bool chmin(_T &x, const _T &y){
bool flag = false;
if ( x > y ){
x = y; flag |= true;
}
return flag;
}
template <class _T>
bool chmax(_T &x, const _T &y){
bool flag = false;
if ( x < y ){
x = y; flag |= true;
}
return flag;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
vector <pair<int,int>> g[n];
for ( int i = 1; i < n; i++ ){
int x, y, w; cin >> x >> y >> w;
g[--x].pb({--y, w});
g[y].pb({x, w});
}
const int inf = 1e15 + 1;
vector <array<int,2>> dp(n, {-inf, -inf});
function <void(int,int,int)> dfs = [&](int x, int par, int prev){
int cnt = 0, l = -inf, r = -inf;
for ( auto [to, w]: g[x] ){
if ( to == par ) continue;
dfs(to, x, w);
cnt += dp[to][1];
int v = dp[to][0] - dp[to][1] + w;
if ( l <= v ){
r = l; l = v;
}
else chmax(r, v);
}
dp[x][0] = max(cnt, cnt + l + r);
if ( x != par ){
dp[x][1] = l + cnt + prev;
}
chmax(dp[x][1], dp[x][0]);
};
dfs(0, 0, 0);
cout << dp[0][1];
cout << '\n';
}
/*
10
4 10 2
1 2 21
1 3 13
6 7 1
7 9 5
2 4 3
2 5 8
1 6 55
6 8 34
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |