제출 #81767

#제출 시각아이디문제언어결과실행 시간메모리
81767chelly경주 (Race) (IOI11_race)C++11
100 / 100
1909 ms107748 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; #define pb push_back #define mp make_pair const int MAXN = 200005, INF = 0x3f3f3f3f; int N, K, H[MAXN][2], L[MAXN]; int sz[MAXN]; map<int, int> best; bool done[MAXN]; vector<pii> adj[MAXN]; queue<pii> ar; int ans = INF, target; void dfs (int u, int p){ sz[u]=1; for (pii e: adj[u]){ if (e.first==p||done[e.first]) continue; dfs(e.first, u); sz[u]+=sz[e.first]; } } int centroid (int u, int p, int S){ for (pii e: adj[u]){ if (sz[e.first]*2>S&&e.first!=p&&!done[e.first]) return centroid(e.first, u, S); } return u; } void path (int u, int p, int length, int cnt){ if (length==target) ans = min(ans, cnt); else{ ar.push(mp(length, cnt)); if (best[target-length]!=0) ans = min(ans, best[target-length]+cnt); } for (pii e: adj[u]){ if (e.first!=p&&!done[e.first]) path (e.first, u, length+e.second, cnt+1); } } void solve(int u){ dfs(u, -1); u = centroid(u, -1, sz[u]); //cout<<u<<endl; best.clear(); done[u] = true; for (pii e: adj[u]){ if (done[e.first]) continue; path (e.first, u, e.second, 1); while (!ar.empty()){ pii p = ar.front(); ar.pop(); if (best[p.first]==0) best[p.first] = p.second; else best[p.first] = min(best[p.first], p.second); } } for (pii e: adj[u]){ if(!done[e.first]) solve(e.first); } } int best_path(int N, int K, int H[][2], int L[]){ target = K; for (int i = 0; i<N-1; i++){ adj[H[i][0]].pb(mp(H[i][1], L[i])); adj[H[i][1]].pb(mp(H[i][0], L[i])); } solve (0); return ans==INF?-1:ans; } /* int main() { cin>>N>>K; for (int i = 0; i<N-1; i++){ scanf("%d%d%d", &H[i][0], &H[i][1], &L[i]); } cout<<best_path(N, K, H, L); }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...