이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#include "race.h"
vector<map<size_t, size_t>> g;
// dp[i][j] holds the minimum size of a path ending at i and having total cost j.
vector<vector<size_t>> dp;
size_t min_size = SIZE_MAX;
void dfs(size_t u, size_t p, size_t k)
{
dp[u][0] = 0;
for (auto [v, w] : g[u])
{
if (v != p)
{
dfs(v, u, k);
for (size_t j = w; j <= k; j++)
if (dp[v][j - w] < SIZE_MAX && dp[u][k - j] < SIZE_MAX)
min_size = min(min_size, dp[v][j - w] + dp[u][k - j] + 1);
for (size_t j = w; j <= k; j++)
if (dp[v][j - w] < SIZE_MAX)
dp[u][j] = min(dp[u][j], dp[v][j - w] + 1);
}
}
min_size = min(min_size, dp[u].back());
}
void test_all(size_t n, size_t u, size_t k)
{
vector<size_t> dis(n, SIZE_MAX);
vector<size_t> steps(n);
queue<size_t> q;
dis[u] = 0;
steps[u] = 0;
q.push(u);
while (!q.empty())
{
size_t x = q.front();
q.pop();
if (dis[x] == k)
{
min_size = min(min_size, steps[x]);
return;
}
if (dis[x] < k)
{
for (auto [v, w] : g[x])
{
if (dis[v] == SIZE_MAX)
{
dis[v] = dis[x] + w;
steps[v] = steps[x] + 1;
q.push(v);
}
}
}
}
}
int best_path(int n, int k, int edges[][2], int length[])
{
g = vector<map<size_t, size_t>>(n);
for (size_t i = 0; i < n - 1; i++)
{
size_t u = edges[i][0], v = edges[i][1], w = length[i];
g[u][v] = w;
g[v][u] = w;
};
if (k > 200)
{
for (size_t i = 0; i < n; i++)
test_all(n, i, k);
return min_size == SIZE_MAX ? -1 : min_size;
}
dp = vector<vector<size_t>>(n, vector<size_t>(k + 1, SIZE_MAX));
dfs(0, 0, k);
return min_size == SIZE_MAX ? -1 : min_size;
}
컴파일 시 표준 에러 (stderr) 메시지
race.cpp: In function 'int best_path(int, int, int (*)[2], int*)':
race.cpp:73:26: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
73 | for (size_t i = 0; i < n - 1; i++)
| ~~^~~~~~~
race.cpp:82:30: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
82 | for (size_t i = 0; i < n; 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... |