제출 #1319131

#제출 시각아이디문제언어결과실행 시간메모리
1319131_unknown_2010경주 (Race) (IOI11_race)C++20
0 / 100
3 ms4152 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; #define vi vector vi<vi<pair<int,int>>> g; vi<int> vis, sz, dis(1e6+5); queue<int> rem; const int inf = 2e9; int ans=inf; int dfs(int i, int par){ sz[i]=1; for(auto &[x, val]:g[i]){ if(vis[x] || x==par)continue; sz[i]+=dfs(x, i); } return sz[i]; } int get_cent(int i, int par, int mx){ for(auto &[x, val]:g[i]){ if(vis[x] || x==par)continue; if(sz[x]>mx/2)return get_cent(x, i, mx); } return i; } void search(int u, int par, int k, queue<pair<int,int>> &nw, int d, int w){ if(k<w)return; ans=min(ans, dis[k-w]+d); nw.push({d, w}); for(auto &[x, val]:g[u]){ if(vis[x] || x==par)continue; search(x, u, k, nw, d+1, w+val); } } void get_ans(int u, int p, int k){ int cent=get_cent(u, p, dfs(u, p)); queue<pair<int,int>> nw; dis[0]=0; for(auto &[x, val]:g[cent]){ if(x==p || vis[x])continue; search(x, cent, k, nw, 1, val); while(!nw.empty()){ auto [d, w] = nw.front(); nw.pop(); dis[w]=min(dis[w], d); rem.push(w); } } vis[cent]=1; while(!rem.empty()){ int x=rem.front(); rem.pop(); dis[x]=inf; } for(auto [x, val]:g[u]){ if(vis[x])continue; get_ans(x, cent, k); } } int best_path(int n, int k, int h[][2], int l[]){ for(int i=0; i<=1e6; i++)dis[i]=inf; g.assign(n, {}); vis.assign(n, 0); sz.assign(n+1, 0); for(int i=0; i<n-1; i++){ g[h[i][0]].push_back({h[i][1], l[i]}); g[h[i][1]].push_back({h[i][0], l[i]}); } get_ans(0, -1, k); if(ans==inf)return -1; else return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...