# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
875589 | abczz | Race (IOI11_race) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <cstring>
#include <array>
#include <vector>
#include <queue>
#include <map>
#include "race.h"
#define ll long long
using namespace std;
bool iscent[200000];
bool del[200000];
vector <array<ll, 2> > adj[200000];
vector <array<ll, 2> > V;
queue <ll> Q;
map <ll, ll> dist;
ll n, k, a, b, c, cur, s, f = 1e18, rt, sz[200000];
ll dfs_sz(ll u, ll p) {
++s;
sz[u] = 1;
iscent[u] = true;
for (auto [v, x] : adj[u]) {
if (!del[v] && v != p) {
sz[u] += dfs_sz(v, u);
}
}
return sz[u];
}
void dfs_cent(ll u, ll w, ll p) {
if (w > s/2) iscent[u] = false;
for (auto [v, x] : adj[u]) {
if (!del[v] && v != p) {
if (sz[v] > s/2) iscent[u] = false;
dfs_cent(v, w+sz[u]-sz[v], u);
}
}
if (iscent[u]) rt = u;
}
void dfs(ll u, ll w, ll z, ll p) {
if (k >= w) {
if (dist.find(k-w) != dist.end()) {
f = min(f, z+dist[k-w]);
}
for (auto [v, x] : adj[u]) {
if (!del[v] && v != p) {
dfs(v, w+x, z+1, u);
}
}
V.push_back({w, z});
}
}
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
cin >> n >> k;
for (int i=0; i<n-1; ++i) {
cin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
dfs_sz(0, -1);
dfs_cent(0, 0, -1);
Q.push(rt);
for (int i=0; i<n; ++i) {
cur = Q.front();
Q.pop();
del[cur] = true;
dist.clear();
dist[0] = 0;
for (auto [v, x] : adj[cur]) {
if (!del[v]) {
dfs(v, x, 1, cur);
while (!V.empty()) {
if (dist.find(V[V.size()-1][0]) == dist.end()) {
dist[V[V.size()-1][0]] = V[V.size()-1][1];
}
else dist[V[V.size()-1][0]] = min(dist[V[V.size()-1][0]], V[V.size()-1][1]);
V.pop_back();
}
}
}
for (auto [v, x] : adj[cur]) {
if (!del[v]) {
s = 0;
dfs_sz(v, cur);
dfs_cent(v, 0, cur);
Q.push(rt);
}
}
}
if (f == 1e18) cout << "-1\n";
else cout << f << '\n';
}