結果
問題 | No.3113 The farthest point |
ユーザー |
![]() |
提出日時 | 2025-04-19 06:37:11 |
言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,818 bytes |
コンパイル時間 | 2,967 ms |
コンパイル使用メモリ | 174,156 KB |
実行使用メモリ | 20,940 KB |
最終ジャッジ日時 | 2025-04-19 06:37:22 |
合計ジャッジ時間 | 10,521 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 WA * 1 RE * 1 |
other | WA * 11 RE * 22 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define int long long #define INF 1e16 #define MAX_N 200010 typedef vector<int> Vec; typedef pair<int, int> pii; struct Edge { int to, cost; Edge(int to, int cost) : to(to), cost(cost) {} }; typedef vector<Edge> Edges; typedef vector<Edges> Graph; int N; Graph G; bool leaf[MAX_N]; Vec dijkstra(int s) { Vec dist(N, INF); dist[s] = 0; priority_queue<pii, vector<pii>, greater<pii>> Q; Q.push(pii(0, s)); while (!Q.empty()) { pii p = Q.top(); Q.pop(); int v = p.second; if (dist[v] < p.first) { continue; } for (int i = 0; i < (int)G[v].size(); i++) { Edge &e = G[v][i]; if (dist[v] + e.cost < dist[e.to]) { dist[e.to] = dist[v] + e.cost; Q.push(pii(dist[e.to], e.to)); } } } return dist; } int get_farthest_point(int v) { Vec vec = dijkstra(v); int resv = -1, max = -1; for (int i = 0; i < N; i++) { if (max < vec[i] && vec[i] != INF) { max = vec[i]; resv = i; } } return resv; } int get_tree_diameter() { int v = -1; for (int i = 0; i < N; i++) { if (!leaf[i]) { v = i; break; } } int v1 = get_farthest_point(v); int v2 = get_farthest_point(v1); Vec d = dijkstra(v2); int res = 0; for (int i = 0; i < (int)d.size(); i++) { if(d[i] != INF){ res = max(res, d[i]); } } return res; } void init() { for (int i = 0; i < (int)G.size(); i++) { G[i].clear(); } G.clear(); G.resize(N); memset(leaf, 0, sizeof(leaf)); } signed main() { int a, b, c; cin >> N; init(); for (int i = 0; i < N-1; i++) { cin >> a >> b; a--; b--; G[a].emplace_back(b, c); G[b].emplace_back(a, c); } cout << get_tree_diameter() << endl; return 0; }