제출 #1266781

#제출 시각아이디문제언어결과실행 시간메모리
1266781cmiucRace (IOI11_race)C++20
0 / 100
14 ms28992 KiB
#include <iostream> #include <queue> #include <algorithm> #include "race.h" using namespace std; int Ans = 1e9, Min[1<<20], block[1<<20], ch[1<<20], KK; vector<pair<int,int>> nei[1<<20]; int centroid(int u, int p, int r){ for (auto [i, w] : nei[u]){ if (!block[i] and i != p and ch[i] * 2 > ch[r]) return centroid(i, u, r); } return u; } void dfs0(int u, int p){ ch[u] = 1; for (auto [i, w] : nei[u]){ if (!block[i] and i != p) dfs0(i, u), ch[u] += ch[i]; } } void dfs1(int u, int p, int L, int pathLen = 1){ if (L <= KK) Ans = min(Ans, pathLen + Min[KK - L]); for (auto [i, w] : nei[u]){ if (!block[i] and i != p) dfs1(i, u, L + w, pathLen + 1); } } void dfs2(int u, int p, int L, int pathLen = 1){ if (L <= KK) Min[L] = min(Min[L], pathLen); for (auto [i, w] : nei[u]){ if (!block[i] and i != p) dfs1(i, u, L + w, pathLen + 1); } } void dfs3(int u, int p, int L, int pathLen = 1){ if (L <= KK) Min[L] = 1e9; for (auto [i, w] : nei[u]){ if (!block[i] and i != p) dfs1(i, u, L + w, pathLen + 1); } } void dfs(int u){ dfs0(u, u); int c = centroid(u, u, u); for (auto [i, l] : nei[c]){ if (!block[i]){ dfs1(i, c, l); dfs2(i, c, l); } } for (auto [i, l] : nei[c]){ if (!block[i]) dfs3(i, c, l); } block[c] = 1; for (auto [i, l] : nei[c]){ if (!block[i]) dfs(i); } } int best_path(int n, int k, int h[][2], int l[]){ for (int i=0;i<n-1;i++){ nei[h[i][0]].push_back({h[i][1], l[i]}); nei[h[i][1]].push_back({h[i][0], l[i]}); } KK = k; // cout<<KK<<endl; for (int i=1;i<(1<<20);i++) Min[i] = 1e9; dfs(0); if (Ans == 1e9) Ans = -1; 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...