Tree/Tree_diameter.h
Depends on
Verified with
Code
#include "../template.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 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_diameter.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};
}
Back to top page