Pagini recente » Cod sursa (job #1650769) | Cod sursa (job #2433181) | Cod sursa (job #1804429) | Cod sursa (job #2558545) | Cod sursa (job #2291806)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> g[1005];
int dist[1005];
vector <int> ans;
vector <int> sol;
bool f[1005];
const int INF = 2000000000;
void cpy()
{
sol.clear();
int i;
for(i=0; i<ans.size(); i++)
sol.push_back(ans[i]);
}
void dfs(int nod, int father, int salv)
{
int negative=INF,pozitive=-1;
for(int i=0; i<g[nod].size(); i++)
if(g[nod][i]!=father){
dfs(g[nod][i], nod, salv);
if(dist[g[nod][i]]<0)
negative=min(negative, dist[g[nod][i]]);
else
pozitive=max(pozitive, dist[g[nod][i]]);
}
if(pozitive==-1){
if(negative==INF)
dist[nod]=0;
else
dist[nod]=negative+1;
}
else{
if(pozitive+1<=-negative-2)
dist[nod]=negative+1;
else
dist[nod]=pozitive+1;
}
if(dist[nod]==salv || (!father && dist[nod]>=0)){
ans.push_back(nod);
dist[nod]=-salv-1;
}
}
int main()
{ freopen("salvare.in", "r",stdin);
freopen("salvare.out", "w",stdout);
int n,k,i,x,y,st,dr,med,soll;
scanf("%d%d", &n, &k);
for(i=1; i<n; i++){
scanf("%d%d", &x, &y);
g[x].push_back(y);
g[y].push_back(x);
}
st=0;
dr=n-1;
while(st<=dr){
med=(st+dr)/2;
ans.clear();
dfs(1, 0, med);
if(ans.size()<=k){
dr=med-1;
soll=med;
cpy();
}
else
st=med+1;
}
printf("%d\n", soll);
for(i=0; i<sol.size(); i++)
f[sol[i]]=1;
for(i=1; i<=n && sol.size()<k; i++)
if(f[i]==0)
sol.push_back(i);
sort(sol.begin(), sol.end());
for(i=0; i<sol.size(); i++)
printf("%d ", sol[i]);
return 0;
}