結果

問題 No.3113 The farthest point
ユーザー moti
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0