이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#ifndef LOCAL
#include "race.h"
#endif // LOCAL
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define ar array
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int maxn = 2e5 + 5;
map<ll, int> sub[maxn];
vector<ii> adj[maxn];
int N, K;
int res = 1e9;
void dfs(int u, int p = -1, int h = 0, ll w = 0)
{
sub[u][w] = h;
for(auto it : adj[u]) if(it.fi != p){
dfs(it.fi, u, h + 1, w + it.se);
int v = it.fi;
if(sub[u].size() < sub[v].size())
swap(sub[u], sub[v]);
for(auto & all : sub[v]){
if(sub[u].count(K + 2 * w - all.fi)){
res = min(res, sub[u][K + 2 * w - all.fi] + all.se - 2 * h);
}
}
for(auto & all : sub[v]){
if(sub[u].count(all.fi)){
sub[u][all.fi] = min(sub[u][all.fi], all.se);
}
else{
sub[u][all.fi] = all.se;
}
}
sub[v].clear();
}
}
int best_path(int _N, int _K, int H[][2], int L[])
{
N = _N;
K = _K;
for(int i = 0; i < N; ++i){
adj[H[i][0]].eb(H[i][1], L[i]);
adj[H[i][1]].eb(H[i][0], L[i]);
}
dfs(0);
if(res == 1e9) res = -1;
return res;
}
#ifdef LOCAL
signed main(void)
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#ifdef LOCAL
freopen("A.INP", "r", stdin);
freopen("A.OUT", "w", stdout);
#endif // LOCAL
cin >> N >> K;
for(int i = 1; i < N; ++i){
int u, v, w; cin >> u >> v >> w;
adj[u].eb(v, w); adj[v].eb(u, w);
}
dfs(0);
cout << res;
}
#endif //LOCAL
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |