Kuro-orzz's Library

This documentation is automatically generated by online-judge-tools/verification-helper

View on GitHub

:heavy_check_mark: Tree/Diameter_tree.test.cpp

Depends on

Code

#define PROBLEM "https://judge.yosupo.jp/problem/tree_diameter"

#include "../template.h"
#include "Tree/Tree.h"

void solve() {
    int n; cin >> n;
    vector<vector<pii>> adj(n);
    for (int i = 0; i < n-1; i++) {
        int u, v, w; cin >> u >> v >> w;
        adj[u].emplace_back(v, w);
        adj[v].emplace_back(u, w);
    }
    auto [len, path] = tree_diameter(adj);
    cout << len << " " << path.size() << '\n';
    reverse(all(path));
    for (int x : path) {
        cout << x << " ";
    }
}
#line 1 "Tree/Diameter_tree.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/tree_diameter"

#line 2 "template.h"

#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define MOD (ll)(1e9+7)
#define all(x) (x).begin(),(x).end()
#define unique(x) x.erase(unique(all(x)), x.end())
#define INF32 ((1ull<<31)-1)
#define INF64 ((1ull<<63)-1)
#define inf (ll)1e18

#define vi vector<int>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second

const int mod = 998244353;

void solve();

int main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);
    // cin.exceptions(cin.failbit);
    // int t; cin >> t;
    // while(t--)
        solve();
    cerr << "\nTime run: " << 1000 * clock() / CLOCKS_PER_SEC << "ms" << '\n';
    return 0;
}
#line 2 "Tree/Tree/Tree.h"

pair<ll, vector<int>> tree_diameter(const vector<vector<pii>>& g) {
    int n = g.size();
    vector<ll> d(n); // dist
    vector<int> p(n); // par

    function<void(int, int, ll)> dfs = [&] (int u, int par, ll cur_d) {
        d[u] = cur_d;
        p[u] = par;
        for (auto [v, w] : g[u]) {
            if (v == par) continue;
            dfs(v, u, cur_d + w);
        }
    };
    dfs(0, -1, 0);
    // r = furthest node from root
    int r = max_element(d.begin(), d.end()) - d.begin();
    dfs(r, -1, 0);
    // r->s = longest path
    int s = max_element(d.begin(), d.end()) - d.begin();

    vector<int> path;
    for (int x = s; x >= 0; x = p[x]) { 
        path.push_back(x);
    }
    return {d[s], path};
}
#line 5 "Tree/Diameter_tree.test.cpp"

void solve() {
    int n; cin >> n;
    vector<vector<pii>> adj(n);
    for (int i = 0; i < n-1; i++) {
        int u, v, w; cin >> u >> v >> w;
        adj[u].emplace_back(v, w);
        adj[v].emplace_back(u, w);
    }
    auto [len, path] = tree_diameter(adj);
    cout << len << " " << path.size() << '\n';
    reverse(all(path));
    for (int x : path) {
        cout << x << " ";
    }
}
Back to top page