結果
問題 | No.3113 The farthest point |
ユーザー |
![]() |
提出日時 | 2025-04-19 07:23:44 |
言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,551 bytes |
コンパイル時間 | 1,284 ms |
コンパイル使用メモリ | 146,288 KB |
実行使用メモリ | 18,140 KB |
最終ジャッジ日時 | 2025-04-19 07:23:52 |
合計ジャッジ時間 | 7,235 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | WA * 33 |
ソースコード
#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <string> #include <map> #include <set> #include <limits> using namespace std; #define rep(i, n) for (int i = 0; i < (n); i++) typedef long long ll; template<typename T> struct Edge { int to; T cost; }; template< typename T > using WeightedGraph = vector<vector<Edge<T>>>; template< typename T > tuple<T, int, int> dfs(const WeightedGraph< T > &g, int idx, int par) { tuple<T, int, int> ret(numeric_limits<T>::lowest(), idx, 0); bool has_child = false; for(auto &e : g[idx]) { if(e.to == par) continue; has_child = true; auto cost = dfs(g, e.to, idx); std::get<0>(cost) += e.cost; std::get<2>(cost) += 1; if (std::get<0>(cost) > std::get<0>(ret) || (std::get<0>(cost) == std::get<0>(ret) && std::get<1>(cost) == std::get<1>(ret) && std::get<2>(cost) < std::get<2>(ret))) { ret = cost; } } if (!has_child) { return make_tuple(0, idx, 0); } return ret; } template< typename T > T tree_diameter(const WeightedGraph< T > &g) { if (g.size() <= 1) return 0; auto p = dfs(g, 0, -1); auto q = dfs(g, std::get<1>(p), -1); return std::get<0>(q) - (ll)std::get<2>(q) * 1e10; } signed main() { int N; cin >> N; WeightedGraph<ll> g(N); rep(i, N - 1) { int u, v; ll w; cin >> u >> v >> w; u--; v--; w += 1e10; g[u].emplace_back(Edge<ll>{v, w}); g[v].emplace_back(Edge<ll>{u, w}); } cout << std::max(0LL, tree_diameter(g)) << endl; }