Submission #639183

#TimeUsernameProblemLanguageResultExecution timeMemory
639183finn__Race (IOI11_race)C++17
31 / 100
3079 ms220104 KiB
#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();
        if (dis[x] == k)
        {
            min_size = min(min_size, steps[x]);
            return;
        }

        if (dis[x] < k)
        {
            for (auto [v, w] : g[u])
            {
                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;
}

Compilation message (stderr)

race.cpp: In function 'int best_path(int, int, int (*)[2], int*)':
race.cpp:71:26: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   71 |     for (size_t i = 0; i < n - 1; i++)
      |                        ~~^~~~~~~
race.cpp:80:30: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   80 |         for (size_t i = 0; i < n; i++)
      |                            ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...