| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1320395 | Thanhs | 경주 (Race) (IOI11_race) | C++20 | 0 ms | 0 KiB |
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 500000
static int N, K;
static int H[MAX_N][2];
static int L[MAX_N];
static int solution;
inline
void my_assert(int e) {if (!e) abort();}
void read_input()
{
int i;
my_assert(2==scanf("%d %d",&N,&K));
for(i=0; i<N-1; i++)
my_assert(3==scanf("%d %d %d",&H[i][0],&H[i][1],&L[i]));
my_assert(1==scanf("%d",&solution));
}
#include <bits/stdc++.h>
using namespace std;
#define name "TENBAI"
#define fi first
#define se second
#define endl '\n'
#define setmin(x, y) x = min((x), (y))
#define setmax(x, y) x = max((x), (y))
#define sqr(x) ((x) * (x))
#define all(x) x.begin(), x.end()
const int inf = 1e9;
const int NM = 2e5 + 5;
vector<pair<int, int>> g[NM];
int n, k, ans = inf, done[NM], sz[NM];
map<int, int> mp;
bool b;
int dfs_sz(int u, int p)
{
sz[u] = 1;
for (auto v : g[u])
if (v.fi != p && !done[v.fi])
sz[u] += dfs_sz(v.fi, u);
return sz[u];
}
int findcen(int u, int p, int SZ)
{
for (auto v : g[u])
if (v.fi != p && !done[v.fi] && 2 * sz[v.fi] >= SZ)
return findcen(v.fi, u, SZ);
return u;
}
void get(int u, int p, int w, int c)
{
if (w > k)
return;
if (mp.count(k - w))
setmin(ans, c + mp[k - w]);
for (auto v : g[u])
if (v.fi != p && !done[v.fi])
get(v.fi, u, w + v.se, c + 1);
}
void add(int u, int p, int w, int c)
{
if (w > k)
return;
if (mp.count(w))
setmin(mp[w], c);
else
mp[w] = c;
for (auto v : g[u])
if (v.fi != p && !done[v.fi])
get(v.fi, u, w + v.se, c + 1);
}
void cen(int u)
{
int c = findcen(u, -1, dfs_sz(u, -1));
mp.clear();
mp[0] = 0;
for (auto v : g[c])
if (!done[v.fi])
{
get(v.fi, c, v.se, 1);
add(v.fi, c, v.se, 1);
}
done[c] = 1;
for (auto v : g[c])
if (!done[v.fi])
cen(v.fi);
}
int best_path(int N, int K, int H[][2], int L[])
{
n = N; k = K;
for (int i = 0; i < n - 1; i++)
{
g[H[i][0]].emplace_back(H[i][1], L[i]);
g[H[i][1]].emplace_back(H[i][0], L[i]);
}
cen(0);
return ans == inf ? -1 : ans;
}
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int ans;
read_input();
ans = best_path(N,K,H,L);
if(ans==solution)
printf("Correct.\n");
else
printf("Incorrect. Returned %d, Expected %d.\n",ans,solution);
return 0;
}
