Pagini recente » Cod sursa (job #2066374) | Cod sursa (job #1056090) | Borderou de evaluare (job #2897029) | Cod sursa (job #2611272) | Cod sursa (job #1729602)
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define MAXN 1010
#define INF 1000000000
using namespace std;
vector<int> g[MAXN];
vector<int> temp,solution;
int n,k,required,limit;
int dp[MAXN],taken[MAXN];
void DFS(int node,int father){
int i,best=INF;
for(i=0;i<g[node].size();i++)
if(g[node][i]!=father){
DFS(g[node][i],node);
dp[node]=max(dp[node],dp[g[node][i]]+1);
best=min(best,dp[g[node][i]]+1);
}
if(dp[node]==limit){
required++;
temp.push_back(node);
dp[node]=-limit-1;
return;
}
if(best<0&&-best-1>=dp[node])
dp[node]=best;
}
bool Check(int value){
required=0;
memset(dp,0,sizeof(dp));
temp.clear();
limit=value;
DFS(1,0);
if(dp[1]>=0){
required++;
temp.push_back(1);
}
if(required<=k)
return true;
return false;
}
int main(){
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
int i,a,b,left,right,middle,answer;
scanf("%d%d",&n,&k);
for(i=1;i<=n-1;i++){
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
left=0;
right=n;
while(left<=right){
middle=(left+right)/2;
if(Check(middle)==true){
answer=middle;
right=middle-1;
solution=temp;
}
else
left=middle+1;
}
printf("%d\n",answer);
for(i=0;i<solution.size();i++)
taken[solution[i]]=1;
for(i=1;i<=n;i++)
if(taken[i]==1)
printf("%d ",i);
else
if(k>solution.size()){
k--;
printf("%d ",i);
}
return 0;
}