結果

問題 No.3113 The farthest point
ユーザー GOTKAKO
提出日時 2025-04-18 20:49:12
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 389 ms / 2,000 ms
コード長 2,412 bytes
コンパイル時間 2,198 ms
コンパイル使用メモリ 211,504 KB
実行使用メモリ 18,296 KB
最終ジャッジ日時 2025-04-18 20:49:24
合計ジャッジ時間 8,539 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 33
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int N; cin >> N;
    vector<vector<pair<int,long long>>> Graph(N);
    for(int i=0; i<N-1; i++){
        int u,v; cin >> u >> v;
        u--; v--;
        int w; cin >> w;
        Graph.at(u).push_back({v,w});
        Graph.at(v).push_back({u,w});
    }

    vector<bool> stop(N);
    auto Size = [&](auto Size,int pos,int back) -> int {
        if(stop.at(pos)) return 0;
        int ret = 1;
        for(auto [to,w] : Graph.at(pos)) if(to != back) ret += Size(Size,to,pos);
        return ret;
    };
    auto centroid = [&](auto centroid,int pos,int back,int siz) -> pair<int,int> {
        if(stop.at(pos)) return {0,-1}; 
        int ret = 1;
        bool cen = true;
        for(auto [to,w] : Graph.at(pos)){
            if(to == back) continue;
            auto ko = centroid(centroid,to,pos,siz);
            if(ko.second != -1) return {-1,ko.second};
            if(ko.first > siz/2) cen = false;
            ret += ko.first;
        }
        if(siz-ret > siz/2) cen = false;
        if(cen) return {-1,pos};
        else return {ret,-1};
    };

    long long answer = 0,inf = 1e18;;
    queue<int> Q; Q.push(0);
    while(Q.size()){
        int pos = Q.front(); Q.pop();
        int siz = Size(Size,pos,-1);
        pos = centroid(centroid,pos,-1,siz).second;

        auto dfs = [&](auto dfs,int p,int b) -> long long {
            if(stop.at(p)) return -inf;
            long long ret = 0;
            for(auto [to,w] : Graph.at(p)){
                if(to == b) continue;
                ret = max(ret,w+dfs(dfs,to,p));
            }
            return ret;
        };
        int n = Graph.at(pos).size();
        pair<long long,long long> Maxw = {0,0};
        auto upd = [&](pair<long long,long long> &a,long long b){
            auto &[v1,v2] = a; 
            if(v1 < b) v2 = v1,v1 = b;
            else if(v2 < b) v2 = b;
        };
        for(int i=0; i<n; i++){
            auto [to,w] = Graph.at(pos).at(i);
            long long kid = dfs(dfs,to,pos);
            upd(Maxw,kid+w);
        }
        {
            auto [v1,v2] = Maxw;
            answer = max(answer,v1+v2);
        }
        for(auto [to,w] : Graph.at(pos)){
            if(stop.at(to)) continue;
            Q.push(to);
        }
        stop.at(pos) = true;
    }
    cout << answer << endl;
}
0