#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 200005;
int n, a, b, w;
vector<pair<int, int>> g[MAXN];
ll poprawne[200005][6];
void dfs(int v, int parent) {
for (auto u : g[v]) {
if(u.first == parent) continue;
dfs(u.first, v);
}
//cout << v << endl;
int deg = (g[v].size() - (v != parent)) / 2 + 1;
vector<ll> dp[2][2];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
dp[i][j] = vector<ll>(2 * deg + 4, -1e18);
// cur, parzystosc, roznica
dp[0][0][0 + deg + 2] = 0;
int cur = 0;
for (auto u : g[v]) {
if(u.first == parent) continue;
cur = 1 - cur;
for (int roznica = -deg; roznica <= deg; roznica++) {
for (int par = 0; par < 2; par++) {
// ujemne indeksy :(
int roz = roznica + deg + 2;
// Syn nie robił ścieżki do ojca
dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][par][roz] + poprawne[u.first][0]);
// Syn stworzył ścieżkę długości 1
dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][par][roz - 1] + poprawne[u.first][1] + u.second);
// Syn stworzył ścieżkę długości 2
dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][1 - par][roz] + poprawne[u.first][2] + u.second);
// Syn stworzył ścieżkę długości 3
dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][par][roz + 1] + poprawne[u.first][3] + u.second);
// Syn stworzył ścieżkę długości 4
dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][par][roz] + poprawne[u.first][4] + u.second);
}
}
}
// Poprawne rozwiązania to takie, że ile1=ile3 i ile2 jest parzyste
for (int i = 2; i <= 4; i++) poprawne[v][i] = -1e18;
poprawne[v][0] = poprawne[v][1] = dp[cur][0][deg + 2];
poprawne[v][2] = dp[cur][0][1 + deg + 2];
poprawne[v][3] = dp[cur][1][0 + deg + 2];
poprawne[v][4] = dp[cur][0][-1 + deg + 2];
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin >> n;
for (int i = 1; i < n; i++) {
cin >> a >> b >> w;
g[a].push_back({b, w});
g[b].push_back({a, w});
}
dfs(1, 0);
cout << poprawne[1][0] << "\n";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 200005; int n, a, b, w; vector<pair<int, int>> g[MAXN]; ll poprawne[200005][6]; void dfs(int v, int parent) { for (auto u : g[v]) { if(u.first == parent) continue; dfs(u.first, v); } //cout << v << endl; int deg = (g[v].size() - (v != parent)) / 2 + 1; vector<ll> dp[2][2]; for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) dp[i][j] = vector<ll>(2 * deg + 4, -1e18); // cur, parzystosc, roznica dp[0][0][0 + deg + 2] = 0; int cur = 0; for (auto u : g[v]) { if(u.first == parent) continue; cur = 1 - cur; for (int roznica = -deg; roznica <= deg; roznica++) { for (int par = 0; par < 2; par++) { // ujemne indeksy :( int roz = roznica + deg + 2; // Syn nie robił ścieżki do ojca dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][par][roz] + poprawne[u.first][0]); // Syn stworzył ścieżkę długości 1 dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][par][roz - 1] + poprawne[u.first][1] + u.second); // Syn stworzył ścieżkę długości 2 dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][1 - par][roz] + poprawne[u.first][2] + u.second); // Syn stworzył ścieżkę długości 3 dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][par][roz + 1] + poprawne[u.first][3] + u.second); // Syn stworzył ścieżkę długości 4 dp[cur][par][roz] = max(dp[cur][par][roz], dp[1 - cur][par][roz] + poprawne[u.first][4] + u.second); } } } // Poprawne rozwiązania to takie, że ile1=ile3 i ile2 jest parzyste for (int i = 2; i <= 4; i++) poprawne[v][i] = -1e18; poprawne[v][0] = poprawne[v][1] = dp[cur][0][deg + 2]; poprawne[v][2] = dp[cur][0][1 + deg + 2]; poprawne[v][3] = dp[cur][1][0 + deg + 2]; poprawne[v][4] = dp[cur][0][-1 + deg + 2]; } int32_t main() { ios_base::sync_with_stdio(0); cin >> n; for (int i = 1; i < n; i++) { cin >> a >> b >> w; g[a].push_back({b, w}); g[b].push_back({a, w}); } dfs(1, 0); cout << poprawne[1][0] << "\n"; } |
English