| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1286718 | ian_otoni | 경주 (Race) (IOI11_race) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int>>> adj;
vector<int> sum_root_to_i;
vector<int> distance_root_to_i;
int ans = 999999;
void pre_process(int node, int father, int sum, int distance){
sum_root_to_i[node] = sum;
distance_root_to_i[node] = distance;
for(auto p : adj[node]){
if(p.first!=father) pre_process(p.first, node, sum+p.second, distance+1);
}
}
map<int, int> solve(int node, int p, int k){
//k = sum_root_to_i[a] + sum_root_to_i[b] - 2*sum_root_to_i[u]
//sum_root_to_i[b] = k - sum_root_to_i[a] + 2*sum_root_to_i[u]
map<int, int> map_n; //soma, distancia
for(const auto &[son, other] : adj[node]){
if(son!=p){
map<int, int> map_s = solve(son, node, k);
if(map_s.find(k+sum_root_to_i[node])!=map_s.end())
ans = min(ans, map_s[k+sum_root_to_i[node]]-distance_root_to_i[node]);
if(map_s.size()>=map_n.size()) swap(map_n, map_s);
for(const auto &[sum, dist] : map_s){
int target = k - sum + 2*sum_root_to_i[node];
if(map_n.find(target)!=map_n.end()) ans = min(ans, dist+map_n[target]-2*distance_root_to_i[node]);
}
for(const auto &[sum, dist] : map_s){
if(map_n.find(sum)==map_n.end()) map_n[sum] = dist;
else map_n[sum] = min(map_n[sum], dist);
}
}
}
if(map_n.find(sum_root_to_i[node])!=map_n.end()) map_n[sum_root_to_i[node]] = min(map_n[sum_root_to_i[node]], distance_root_to_i[node]);
else map_n[sum_root_to_i[node]] = distance_root_to_i[node];
return map_n;
}
int best_path(int N, int K, int H[][2], int L[]){
ans = 999999;
adj.assign(N, vector<pair<int, int>>());
sum_root_to_i.assign(N, 0);
distance_root_to_i.assign(N, 0);
for(int i=0; i<N-1; i++){
int u = H[i][0];
int v = H[i][1];
int w = L[i];
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
pre_process(0, -1, 0, 0);
solve(0, -1, K);
if(ans==999999) return -1;
return ans;
}
int main(){
}
