結果
| 問題 |
No.3113 The farthest point
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-19 17:55:23 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 385 ms / 2,000 ms |
| コード長 | 1,264 bytes |
| コンパイル時間 | 3,523 ms |
| コンパイル使用メモリ | 284,144 KB |
| 実行使用メモリ | 21,140 KB |
| 最終ジャッジ日時 | 2025-04-19 17:55:34 |
| 合計ジャッジ時間 | 10,857 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll LLINF = 1LL << 60;
int main() {
int N;
cin >> N;
vector<vector<pair<int, ll>>> G(N);
for(int i = 0; i < N - 1; i++) {
int u, v, w;
cin >> u >> v >> w;
u--, v--;
G[u].emplace_back(v, w);
G[v].emplace_back(u, w);
}
vector<ll> dp(N);
auto dfs1 = [&](auto&& self, int u, int p) -> void {
ll res = 0;
for(auto [v, w] : G[u]) {
if(v == p) continue;
self(self, v, u);
res = max(res, dp[v] + w);
}
dp[u] = res;
};
dfs1(dfs1, 0, -1);
vector<ll> ans(N);
auto dfs2 = [&](auto&& self, int u, int p) -> void {
ans[u] = dp[u];
int sz = G[u].size();
vector<ll> lmax(sz + 1, -LLINF);
for(int i = 0; i < sz; i++) {
auto [v, w] = G[u][i];
lmax[i + 1] = max(lmax[i], dp[v] + w);
}
vector<ll> rmax(sz + 1, -LLINF);
for(int i = sz - 1; i >= 0; i--) {
auto [v, w] = G[u][i];
rmax[i] = max(rmax[i + 1], dp[v] + w);
}
for(int i = 0; i < sz; i++) {
auto [v, w] = G[u][i];
if(v == p) continue;
ll dpu = dp[u], dpv = dp[v];
dp[u] = max(lmax[i], rmax[i + 1]);
dp[v] = max(dp[v], dp[u] + w);
self(self, v, u);
dp[u] = dpu;
dp[v] = dpv;
}
};
dfs2(dfs2, 0, -1);
cout << (*max_element(ans.begin(), ans.end())) << endl;
}