Pagini recente » Cod sursa (job #1286908) | Cod sursa (job #3167447) | Cod sursa (job #2102544) | Cod sursa (job #2440665) | Cod sursa (job #554275)
Cod sursa(job #554275)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define f first
#define s second
const int maxn = 1005;
using namespace std;
int i , j , k , n , a, b , step , ans , mins[maxn] , aux[maxn] , dg[maxn] , last;
bool used[maxn] , sol[maxn];
queue <pair <int , int > > Q;
vector <int> G[maxn];
struct e {
int x , y;
} edges[maxn];
void delete_edge (int u , int v) {
int i;
G[v].pop_back();
for( i = 0 ; i < G[u].size() ; ++i )
if ( G[u][i] == v ) {
G[u].erase(G[u].begin() + i);
return;
}
}
int count (int dist)
{
int i , cnt = 0;
memset( used, 0 , sizeof(used));
for( i = 1 ; i < n ; ++i ) {
G[edges[i].x].push_back(edges[i].y);
G[edges[i].y].push_back(edges[i].x);
}
for( i = 1 ; i <= n ; ++i ) {
aux[i] = dg[i];
if( aux[i] == 1 )
Q.push( make_pair( i , dist ) );
else mins[i] = n + 1;
}
for( ; ! Q.empty() ; ) {
pair <int , int > act = Q.front();
Q.pop();
if ( G[act.f].empty()) continue;
int dad = G[act.f].back();
aux[dad]-- , delete_edge( dad , act.f );
mins[dad] = min( mins[dad] , act.second);
if ( aux[dad] == 1 ) {
if( mins[dad] - 1 == 0) {
used[dad] = 1;
cnt++;
Q.push( make_pair( dad , dist) );
}
else
Q.push(make_pair(dad , mins[dad] - 1));
}
}
return cnt;
}
int main()
{
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
scanf("%d\n%d",&n,&k);
for( i = 1 ; i < n ; ++i ) {
scanf("%d %d",&a,&b);
dg[a]++ , dg[b]++;
edges[i].x = a , edges[i].y = b;
}
if ( n == k ) {
printf("0\n");
for( i = 1 ; i <= n ; ++i )
printf("%d ",i);
return 0;
}
for( step = 1 ; step <= n ; step <<= 1 );
ans = step - 1;
step >>= 1;
for( ; step > 1 ; step >>= 1 ) {
int t = count( ans - step );
if ( t <= k ) {
ans -= step;
last = t;
for( i = 1 ; i <= n ; ++i ) sol[i] = used[i];
}
}
printf("%d\n",ans);
for ( i = 1 ; i <= n ; ++i )
if ( last < k && !sol[i]) {
printf("%d ",i);
last++;
}
else {
if ( sol[i] )
printf("%d ",i);
}
return 0;
}