Pagini recente » Cod sursa (job #410636) | Cod sursa (job #2277774) | Cod sursa (job #1148854) | Cod sursa (job #2779744) | Cod sursa (job #2099505)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n, k, NR;
bool viz[1005];
int GR[1005], gr[1005], d[1005], Sol[1005];
vector <int> v[1005];
queue <int> q;
inline bool check(int T){
for(int i = 1; i <= n ; ++i){
gr[i] = GR[i]; d[i] = -1;
if(GR[i] == 1) q.push(i), d[i] = 0;
}
NR = 0;
while(!q.empty()){
int nod = q.front(); q.pop();
if(d[nod] == T) {d[nod] = 0, ++NR; Sol[NR] = nod;}
for(vector <int> :: iterator it = v[nod].begin(); it != v[nod].end() ; ++it){
--gr[*it];
if(gr[*it] != 0) d[*it] = max(d[*it], d[nod] + 1);
if(gr[*it] == 1) q.push(*it);
}
}
if(NR <= k) return 1;
return 0;
}
int main()
{
freopen("salvare.in", "r", stdin);
freopen("salvare.out", "w", stdout);
scanf("%d%d", &n, &k);
int x, y;
for(int i = 1; i < n ; ++i){
scanf("%d%d", &x, &y);
v[x].push_back(y);
v[y].push_back(x);
++GR[x]; ++GR[y];
}
if(n <= k){
printf("0\n");
for(int i = 1; i <= n ; ++i)
printf("%d ", i);
return 0;
}
int st = 1, dr = n - 1;
while(st <= dr){
int mij = (st + dr) / 2;
if(check(mij)) dr = mij - 1;
else st = mij + 1;
}
if(!check(st))--st;
printf("%d\n", st);
int dif = k - NR;
for(int i = 1; i <= NR ; ++i) viz[Sol[i]] = 1;
for(int i = 1; i <= n && dif > 0 ; ++i){
if(viz[i]) continue ;
Sol[++NR] = i;
--dif;
}
sort(Sol + 1, Sol + NR + 1);
for(int i = 1; i <= NR ; ++i)
printf("%d ", Sol[i]);
return 0;
}