Submission #764865

#TimeUsernameProblemLanguageResultExecution timeMemory
764865The_SamuraiParkovi (COCI22_parkovi)C++17
20 / 110
113 ms31904 KiB
#include "bits/stdc++.h"

using namespace std;
using ll = long long;

int n, k;
vector<bool> vis;
vector<vector<pair<int, int>>> g;
vector<ll> dp;
ll ans;
int best_pos;

void sol2_dfs1(int u, int p) {
    for (auto [v, w]: g[u]) {
        if (v == p) {
            continue;
        }
        sol2_dfs1(v, u);
        dp[u] = max(dp[u], dp[v] + w);
    }
}

void sol2_dfs2(int u, int p, ll val) {
    if (ans > max(dp[u], val)) {
        ans = max(dp[u], val);
        best_pos = u;
    }
    ll mx1 = val, mx2 = 0;
    for (auto [v, w]: g[u]) {
        if (v == p) {
            continue;
        }
        if (mx1 < dp[v] + w) {
            mx2 = mx1;
            mx1 = dp[v] + w;
        } else {
            mx2 = max(mx2, dp[v] + w);
        }
    }
    for (auto [v, w]: g[u]) {
        if (v == p) {
            continue;
        }
        if (dp[v] + w == mx1) {
            sol2_dfs2(v, u, mx2 + w);
        } else {
            sol2_dfs2(v, u, mx1 + w);
        }
    }
}

void solve() {
    cin >> n >> k;
    g.assign(n + 1, {});
    for (int i = 1; i < n; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].emplace_back(v, w);
        g[v].emplace_back(u, w);
    }
    if (k == 1) {
        dp.assign(n + 1, 0);
        ans = 1e18;
        sol2_dfs1(1, 0);
        sol2_dfs2(1, 0, 0);
        cout << ans << '\n' << best_pos;
        return;
    }
    if (n <= 20) {
        ans = 1e18;
        vector<int> built;
        for (int i = 0; i < (1 << n); i++) {
            if (__builtin_popcount(i) != k) {
                continue;
            }
            priority_queue<pair<ll, int>> pq;
            vector<int> now;
            for (int j = 0; j < n; j++) {
                if ((1 << j) & i) {
                    pq.emplace(0, j + 1);
                    now.emplace_back(j + 1);
                }
            }
            vis.assign(n + 1, false);
            ll close = 0;
            while (!pq.empty()) {
                auto [d1, u] = pq.top();
                pq.pop();
                if (vis[u]) {
                    continue;
                }
                vis[u] = true;
                d1 = -d1;
                close = max(close, d1);
                for (auto [v, d2]: g[u]) {
                    if (!vis[v]) {
                        pq.emplace(-d1 - d2, v);
                    }
                }
            }
            if (ans > close) {
                ans = close;
                built = now;
            }
        }
        cout << ans << '\n';
        for (int x: built) {
            cout << x << ' ';
        }
        return;
    }

}

int main() {
    ios_base::sync_with_stdio(false);
    cout.tie(nullptr);
    cin.tie(nullptr);

    int queries = 1;
#ifdef test_cases
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
//    cin >> queries;
#else
    //    cin >> queries;
#endif

    for (int test_case = 1; test_case <= queries; test_case++) {
        solve();
//        cout << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...