Pagini recente » Cod sursa (job #101007) | Cod sursa (job #514802) | Cod sursa (job #1987927) | Cod sursa (job #1953708) | Cod sursa (job #2390477)
#include <fstream>
#include <vector>
#include <algorithm>
#define DIM 1010
#define INF 1e9
using namespace std;
ifstream in ("salvare.in");
ofstream out("salvare.out");
int n, k, used, ok, dst, x, y;
int dp[DIM];
bool viz[DIM], ambulance[DIM];
vector<int> arb[DIM];
void dfs(int node, int father){
viz[node] = true;
if(arb[node].size() == 1 && arb[node].front() == father){
dp[node] = dst;
return;
}
for(auto nextNode : arb[node]){
if(viz[nextNode])
continue;
dfs(nextNode, node);
}
if(ok == 0)
return;
int crt = INF, maxim = -1;
for(auto nextNode : arb[node]){
if(nextNode == father)
continue;
crt = min(crt, dp[nextNode] - 1);
maxim = max(maxim, dp[nextNode] - 1);
}
if(maxim > dst && maxim - dst + 1 <= dp[node]){
dp[node] = maxim;
}
else{
dp[node] = crt;
}
if(crt == 0){
if(used == k){
ok = 0;
return;
}
++ used;
ambulance[node] = true;
dp[node] = 2 * dst + 1;
}
}
bool calc(int dist){
used = 0;
ok = 1;
dst = dist;
for(int i = 1; i <= n; ++ i){
viz[i] = false;
ambulance[i] = false;
dp[i] = 0;
}
dfs(1, 0);
return ok;
}
int main()
{
in>>n>>k;
for(int i = 1; i < n; ++ i){
in>>x>>y;
arb[x].push_back(y);
arb[y].push_back(x);
}
int st = 1, dr = n, ans = n;
while(st <= dr){
int mid = (st + dr) / 2;
if(calc(mid)){
dr = mid - 1;
ans = mid;
}
else{
st = mid + 1;
}
}
calc(ans);
out<<ans<<'\n';
int nr = 0;
for(int i = 1; i <= n; ++ i){
if(ambulance[i] == true)
++ nr;
}
for(int i = 1; i <= n && nr < k; ++ i){
if(ambulance[i] == 0){
ambulance[i] = true;
++ nr;
}
}
for(int i = 1; i <= n; ++ i){
if(ambulance[i] == true)
out<<i<<" ";
}
return 0;
}