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