Submission #1291419

#TimeUsernameProblemLanguageResultExecution timeMemory
1291419nhan0123456Museum (CEOI17_museum)C++20
20 / 100
280 ms352160 KiB
#include <bits/stdc++.h>
using namespace std;
bool memory1;

typedef long long ll;
typedef unsigned long long ull;
typedef double dbe;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
typedef vector<ll> vll;
typedef vector<int> vii;

#define openFile(name) freopen((name ".inp"), "r", stdin), freopen((name ".out"), "w", stdout)
#define FOR(i, a, b, x) for (ll i = (a); i <= (b); i += (x))
#define ROF(i, a, b, x) for (ll i = (a); i >= (b); i += (x))
#define fi first
#define se second
#define MASK(x) (1LL << (x))
#define getBit(mask, i) (((mask) >> (i)) & 1)
#define BitOn(mask) (__builtin_popcountll(mask))

const int maxN = 1e4 + 5;
//const ll maxBit = MASK(8) + 2;
const ll LOG = 20;
const ll INF18 = 1e18;
const int INF9 = 1e9;
//const ll INF3f = 0x3f3f3f3f3f3f3f3f;
const ll MOD = 1e9 + 7;

//////////////////////////////////////////////
/////////////////nhan0123456//////////////////
//////////////////////////////////////////////

ll n, K, X;
int sz[maxN];

ll dp[2][maxN][maxN];
ll tmp[2][maxN];
vector<pii> adj[maxN];

void dfs(int u, int pre) {
    sz[u] = 1;

    for (pii &p : adj[u]) if (p.se != pre) {
        dfs(p.se, u);
        sz[u] += sz[p.se];
    }

    // tao tmp;
    tmp[0][0] = tmp[1][0] = 0;
    FOR (i, 1, sz[u], 1) tmp[0][i] = tmp[1][i] = INF18;

    int knapSize = 0;
    for (pii &p : adj[u]) if (p.se != pre) {
        int v, w;
        tie(w, v) = p;
        ROF (pre, knapSize, 0, -1) {
            FOR (cur, 1, sz[v], 1) {
                int sum = pre + cur;
                /*
                    di vao v roi dung tai v
                    di vao v roi dung tai x
                    di vao v roi dung tai v
                */
                tmp[0][sum] = min(tmp[0][sum], tmp[0][pre] + dp[0][v][cur] + 2 * w);
                tmp[1][sum] = min(tmp[1][sum], tmp[0][pre] + dp[1][v][cur] + w);
                tmp[1][sum] = min(tmp[1][sum], tmp[1][pre] + dp[0][v][cur] + 2 * w);
            }
            knapSize += sz[v];
        }
    }
    FOR (i, 0, sz[u] - 1, 1) {
        dp[0][u][i + 1] = tmp[0][i];
        dp[1][u][i + 1] = tmp[1][i];
    }
}

ll Solve() {
    /*
        root = x;
        bien doi bai toan thanh la di tu x ve x di qua K dinh phan biet
        goi dp u j la tong thoi gian de tham j dinh trong cay con goc u
        va quay lai u

        v1, v2, .. ,vt la con truc tiep cua u
        -> dp u j = min (sum(dp vi si) + (si>0 * 2wi)), voi s1 + s2 + .. + st = k - 1

        goi tmp i j la tong chi phi neu chon j dinh phan biet o i con dau tien voi 1 <= i <= t
        tmp i j = min tmp i - 1 j - c + dp vi, c + c>0 * 2 * wi

        -> dp 0 la di ve u
        -> dp 0 la di ve u

    */
    dfs(X, X);
    return dp[1][X][K];
}

void input() {
    cin >> n >> K >> X;
    int u, v, w;
    FOR (i, 2, n, 1) {
        cin >> u >> v >> w;
        adj[u].emplace_back(w, v);
        adj[v].emplace_back(w, u);
    }
    cout << Solve();
}

int main() {
    //openFile("temp");
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    input();

    //bool memory2;
    //cerr << "\n\n\nTime: "<< 1000.0 * clock() / CLOCKS_PER_SEC << " ms";
    //cerr << "\n\n\nMemory: "<< abs(&memory1 - &memory2) * 1.0 / MASK(20) <<" MB";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...