This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<int, int> pp;
const int MAXN = 2 * 1e5 + 100;
const int INF = 1e9;
struct mapa{
int val = INF;
};
int n, k;
vector<pp> v[MAXN];
int p[MAXN] = { 0 };
int vel[MAXN] = { 0 };
map<int, mapa> m;
vector<int> s;
int sol = INF;
int cnt = 0;
int dfs(int x, int depth, int sum, int val){
p[x] = 1;
if (val == 0)
++cnt;
else if (val == 1 && sum <= k && m[k - sum].val != INF){
int zb = depth + m[k - sum].val - 1;
sol = min(sol, zb);
}
else if (val == 2 && sum <= k){
s.push_back(sum);
m[sum].val = min(m[sum].val, depth);
}
for (int i = 0; i < v[x].size(); ++i){
int y = v[x][i].first;
if (!p[y]){
int rt = dfs(y, depth + 1, sum + v[x][i].second, val);
if (val == 0)
vel[x] += rt;
}
}
if (val == 0)
++vel[x];
p[x] = 0;
if (val == 0)
return vel[x];
return 0;
}
int centr(int x){
pp maks = {-1, -1};
for (int i = 0; i < v[x].size(); ++i){
int y = v[x][i].first;
if (!p[y] && vel[y] > maks.second)
maks = {y, vel[y]};
}
if (maks.second <= cnt / 2)
return x;
return maks.first;
}
void solve(int x){
for (int i = 0; i < v[x].size(); ++i){
int y = v[x][i].first;
if (!p[y]){
dfs(y, 2, v[x][i].second, 1); dfs(y, 2, v[x][i].second, 2);
}
}
for (int i = 0; i < s.size(); ++i)
m[s[i]].val = INF;
s.clear(); return;
}
void decompose(int x){
cnt = 0; dfs(x, 1, 0, 0);
int root = centr(x); p[root] = 1;
solve(root);
for (int i = 0; i < v[root].size(); ++i){
int y = v[root][i].first;
if (!p[y]) decompose(y);
}
}
int best_path(int N, int K, int H[MAXN][2], int L[MAXN]){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
for (int i = 0; i < N - 1; ++i){
v[H[i][0]].push_back({H[i][1], L[i]});
v[H[i][1]].push_back({H[i][0], L[i]});
}
decompose(0);
if (sol == INF)
return -1;
else return (sol - 1);
return 0;
}
Compilation message (stderr)
race.cpp: In function 'int dfs(int, int, int, int)':
race.cpp:36:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
36 | for (int i = 0; i < v[x].size(); ++i){
| ~~^~~~~~~~~~~~~
race.cpp: In function 'int centr(int)':
race.cpp:54:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
54 | for (int i = 0; i < v[x].size(); ++i){
| ~~^~~~~~~~~~~~~
race.cpp: In function 'void solve(int)':
race.cpp:65:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
65 | for (int i = 0; i < v[x].size(); ++i){
| ~~^~~~~~~~~~~~~
race.cpp:71:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
71 | for (int i = 0; i < s.size(); ++i)
| ~~^~~~~~~~~~
race.cpp: In function 'void decompose(int)':
race.cpp:80:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
80 | for (int i = 0; i < v[root].size(); ++i){
| ~~^~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |