제출 #1353478

#제출 시각아이디문제언어결과실행 시간메모리
1353478nhan0123456Museum (CEOI17_museum)C++20
100 / 100
205 ms359988 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)) & 1LL)
#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, X, K;
int sz[maxN];
ll tmp[2][maxN];
ll dp[2][maxN][maxN];
vector<pll> adj[maxN];

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

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

    int knapSize = 0;
    for (pll &p : adj[u]) if (p.se != pre) {
        ll v, w;
        tie(w, v) = p;
        ROF (pre, knapSize, 0, -1)
            FOR (cur, 1, sz[v], 1) {
                int sum = pre + cur;
                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() {
    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() << "\n";
}

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

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

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…