Pagini recente » Cod sursa (job #2974238) | Cod sursa (job #120219) | Cod sursa (job #2178531) | Cod sursa (job #2859671) | Cod sursa (job #3148563)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("salvare.in");
ofstream fout("salvare.out");
const int Nmax = 1005, INF = 1000000000;
vector<int> L[Nmax];
int dp[Nmax],c[Nmax];
bool b[Nmax];
int dfs(int node, int father, int d){
int nr = 0;
for(int son : L[node]){
if(son!=father)
nr+=dfs(son, node, d);
}
int nmin = INF,nmax = -INF,cmax = -1;
if(L[node].size() == 1){
dp[node] = -1; b[node] = 0;
c[node] = 1;
}
else{
for(int son : L[node]){
if(son!=father && dp[son]!=-1){
nmin = min(nmin, dp[son]);
nmax = max(nmax, dp[son]);
}
if(son!=father)
cmax = max(cmax, c[son]);
}
if(nmin == INF){
c[node] = cmax+1; b[node] = 0;
dp[node] = -1;
if(c[node]>d){
dp[node] = 0; c[node] = -1;
b[node] = 1;
nr++;
}
}
else{
if(cmax == -1 || nmin+cmax+1<=d)
c[node] = -1;
else
c[node] = cmax+1;
if((nmax == 2*d) || (node == 1 && nmax+nmin>=2*d) || (c[node]>d)){
dp[node] = 0; c[node] = -1;
b[node] = 1;
nr++;
}
else{
dp[node] = nmin+1;
b[node] = 0;
}
}
}
return nr;
}
int main()
{
int n,k,i,st,dr,mid,sol,nr;
fin >> n >> k;
for(i=1;i<n;i++){
int x,y;
fin >> x >> y;
L[x].push_back(y);
L[y].push_back(x);
}
L[1].push_back(0);
st = 1; dr = n; sol = n;
while(st<=dr){
mid = (st+dr)/2;
nr = dfs(1,0,mid);
if(nr<=k){
sol = mid;
dr = mid-1;
}
else
st = mid+1;
}
fout << sol << '\n';
nr = dfs(1,0,sol);
nr = 0;
for(i=1;i<=n;i++){
if(b[i] == 1)
nr++;
}
nr = k-nr;
for(i=1;i<=n;i++){
if((b[i] == 1) || (b[i] == 0 && nr>0)){
fout << i << " ";
if(b[i] == 0)
nr--;
}
}
return 0;
}