This documentation is automatically generated by online-judge-tools/verification-helper
#include "Graph/centroid_decomposition.hpp"#pragma once
#include "../Graph/graph.hpp"
template <class Cost = int>
struct Centroid {
Graph<Cost> graph;
std::vector<bool> deleted;
std::vector<int> sz;
explicit Centroid(const Graph<Cost>& graph)
: graph(graph), deleted(graph.size(), false), sz(graph.size()) {}
int szdfs(int v, int p = -1) {
sz[v] = 1;
for (auto e : graph[v]) {
if (e.dst == p || deleted[e.dst]) continue;
sz[v] += szdfs(e.dst, v);
}
return sz[v];
}
int find(int v) {
int n = szdfs(v);
int p = -1;
while (true) {
int nxt = -1;
for (auto e : graph[v]) {
if (e.dst == p || deleted[e.dst]) continue;
if (nxt == -1 || sz[e.dst] > sz[nxt]) nxt = e.dst;
}
if (nxt == -1 || sz[nxt] <= n / 2) return v;
p = v;
v = nxt;
}
}
};#line 2 "Graph/centroid_decomposition.hpp"
#line 2 "Graph/graph.hpp"
#include <vector>
template <class Cost = int>
struct Edge {
int src, dst;
Cost cost;
Edge() = default;
Edge(int src, int dst, Cost cost = 1)
: src(src), dst(dst), cost(cost){};
bool operator<(const Edge<Cost>& e) const { return cost < e.cost; }
bool operator>(const Edge<Cost>& e) const { return cost > e.cost; }
};
template <class Cost = int>
struct Graph : public std::vector<std::vector<Edge<Cost>>> {
using std::vector<std::vector<Edge<Cost>>>::vector;
void span(bool direct, int src, int dst, Cost cost = 1) {
(*this)[src].emplace_back(src, dst, cost);
if (!direct) (*this)[dst].emplace_back(dst, src, cost);
}
};
#line 4 "Graph/centroid_decomposition.hpp"
template <class Cost = int>
struct Centroid {
Graph<Cost> graph;
std::vector<bool> deleted;
std::vector<int> sz;
explicit Centroid(const Graph<Cost>& graph)
: graph(graph), deleted(graph.size(), false), sz(graph.size()) {}
int szdfs(int v, int p = -1) {
sz[v] = 1;
for (auto e : graph[v]) {
if (e.dst == p || deleted[e.dst]) continue;
sz[v] += szdfs(e.dst, v);
}
return sz[v];
}
int find(int v) {
int n = szdfs(v);
int p = -1;
while (true) {
int nxt = -1;
for (auto e : graph[v]) {
if (e.dst == p || deleted[e.dst]) continue;
if (nxt == -1 || sz[e.dst] > sz[nxt]) nxt = e.dst;
}
if (nxt == -1 || sz[nxt] <= n / 2) return v;
p = v;
v = nxt;
}
}
};