#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
vector<pair<int, int>> adj[N];
bool flag[N], marked[N];
int n, k, cnt;
long long mid;
// DFS trả khoảng cách chính xác như code AC của bạn
long long dfs(int u, int p) {
if (adj[u].size() == 1 && u != 0) return 0;
long long mi = LLONG_MAX, ma = LLONG_MIN;
for (auto [v, w] : adj[u]) {
if (v == p) continue;
long long dist = dfs(v, u);
if (dist == 0 && flag[v]) {
mi = min(mi, 0LL);
ma = max(ma, 0LL);
continue;
}
if (dist < 0 && dist + w <= 0)
flag[u] = 1;
if (dist < 0 && dist + w > 0)
dist = 0;
else
dist += w;
if (dist > mid) {
cnt++;
marked[v] = 1;
flag[v] = 1;
dist = min(-mid + w, 0LL);
if (-mid + w <= 0) flag[u] = 1;
}
ma = max(ma, dist);
mi = min(mi, dist);
}
if (-mi >= ma) return mi;
return ma;
}
// Check bán kính mid hợp lệ
bool check(long long R) {
mid = R;
cnt = 0;
memset(flag, 0, sizeof(flag));
memset(marked, 0, sizeof(marked));
if (dfs(0, -1) > 0 || !flag[0]) {
marked[0] = 1;
cnt++;
}
return cnt <= k;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> k;
for (int i = 1, u, v, w; i < n; i++) {
cin >> u >> v >> w;
u--; v--;
adj[u].emplace_back(v, w);
adj[v].emplace_back(u, w);
}
long long l = 0, r = (1LL << 60), res = r;
while (l <= r) {
long long m = (l + r) / 2;
if (check(m)) {
res = m;
r = m - 1;
} else l = m + 1;
}
// Tìm lại vị trí các node đặt công viên
check(res);
vector<int> ans;
for (int i = 0; i < n; ++i)
if (marked[i]) ans.push_back(i+1);
for (int i = 0; ans.size() < k && i < n; ++i)
if (!marked[i]) ans.push_back(i+1);
cout << res << "\n";
for (int x : ans) cout << x << " ";
cout << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |