Pagini recente » Cod sursa (job #1727496) | Cod sursa (job #2344616) | Cod sursa (job #2373488) | Cod sursa (job #380196) | Cod sursa (job #2390497)
#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] = 0;
return;
}
for(auto nextNode : arb[node]){
if(viz[nextNode])
continue;
dfs(nextNode, node);
}
if(ok == 0)
return;
int crt = -1, maxim = -1;
for(auto nextNode : arb[node]){
if(nextNode == father)
continue;
crt = max(crt, dp[nextNode] + 1);
maxim = min(maxim, dp[nextNode] + 1);
}
if(maxim < 0 && - maxim - 1 >= dp[node]){
dp[node] = maxim;
}
else{
dp[node] = crt;
}
if(crt == dst){
if(used == k){
ok = 0;
return;
}
++ used;
ambulance[node] = true;
dp[node] = - 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;
}