제출 #1119162

#제출 시각아이디문제언어결과실행 시간메모리
1119162LonlyRMuseum (CEOI17_museum)C++17
100 / 100
409 ms784972 KiB
#include<bits/stdc++.h>

using namespace std;
const int maxn = 10004;
int n, k, x;
int f[maxn][maxn], g[maxn][maxn], sub[maxn];
vector<pair<int,int>> adj[maxn];

inline void MIN(int &x, int y)
{
    x = min(x, y);
}

void merge(int x, int y, int w)
{
    for (int i = sub[x]; i >= 0; i--)
        for (int j = sub[y]; j >= 0; j--)
        {
            MIN(f[x][i + j], min(f[x][i] + g[y][j] + w * 2, g[x][i] + f[y][j] + w));
            MIN(g[x][i + j], g[x][i] + g[y][j] + w * 2);
        }
    sub[x] += sub[y];
}

void dfs(int x, int p = 0)
{
    f[x][1] = g[x][1] = 0;
    sub[x] = 1;
    for (auto [i, j] : adj[x]) if (i != p)
    {
        dfs(i, x);
        merge(x, i, j);
    }
}


signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
//    freopen("test.inp", "r", stdin);
//    freopen("test.out", "w", stdout);
    cin >> n >> k >> x;
    for (int i = 1, u, v, w; i < n; i++)
        cin >> u >> v >> w,
        adj[u].emplace_back(v, w),
        adj[v].emplace_back(u, w);
    memset(f, 0x3f, sizeof f);
    memset(g, 0x3f, sizeof g);
    dfs(x);
    cout << min(f[x][k], g[x][k]);
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...