Pagini recente » Cod sursa (job #941570) | Cod sursa (job #2574235) | Cod sursa (job #1766025) | Cod sursa (job #2077544) | Cod sursa (job #1799673)
#include <bits/stdc++.h>
using namespace std;
ifstream f("salvare.in");
ofstream g("salvare.out");
const int inf=1<<30;
int n,k,x,y,dist,cur,dp[1<<10];
vector<int> V[1<<10],sol,vec;
bool viz[1<<10];
void dfs(int X, int Y) {
int minim = inf;
for (vector<int>::iterator adj = V[X].begin(); adj != V[X].end(); ++adj) {
if (*adj == Y) continue;
dfs(*adj, X);
dp[X] = max(dp[X], dp[*adj] + 1);
minim = min(minim, dp[*adj] + 1);
}
if (dp[X]==dist) {
++cur;
vec.push_back(X);
dp[X]=-dist-1;
return;
}
if(minim<0&&-minim-1>=dp[X]) dp[X]=minim;
}
bool verif(int distt) {
dist=distt,cur=0;
vec.clear();
memset(dp, 0, sizeof dp);
dfs(1,0);
if(dp[1]>=0) {
++cur;
vec.push_back(1);
}
return (cur<=k);
}
int main() {
f >> n >> k;
for (int i = 1; i < n; ++i) {
f >> x >> y;
V[x].push_back(y);
V[y].push_back(x);
}
int left=0,right=n,ans=0;
while(left<=right) {
int mid=(left+right)>>1;
if (verif(mid)) {
ans=mid;
sol=vec;
right=mid-1;
}
else left=mid+1;
}
g<<ans<<'\n';
sort(sol.begin(),sol.end());
for(int i=0;i<sol.size();++i) viz[sol[i]]=1;
k -= sol.size();
for(int i=1;i<=n;++i)
if(viz[i]) g<<i<<' ';
else if(k>0){
--k;
g<<i<<' ';
}
return 0;
}