Pagini recente » Cod sursa (job #2858106) | Cod sursa (job #1930349) | Cod sursa (job #1030151) | Cod sursa (job #1089124) | Cod sursa (job #720362)
Cod sursa(job #720362)
#include <stdio.h>
#include <vector>
#define NMAX 1005
#define INF 1000000000
#define pb push_back
using namespace std;
int n,k,dad[NMAX],st[NMAX],r,rez,t;
vector <int> A[NMAX];
char viz[NMAX],marc[NMAX];
int dist[NMAX],when[NMAX];
void read()
{
scanf("%d%d",&n,&k);
int i,a,b;
for (i=1; i<n; i++)
{
scanf("%d%d",&a,&b);
A[a].pb(b);
A[b].pb(a);
}
}
void dfs(int nod)
{
viz[nod]=1;
int i,vec;
for (i=0; i<A[nod].size(); i++)
{
vec=A[nod][i];
if (!viz[vec])
{
dad[vec]=nod;
dfs(vec);
}
}
st[++r]=nod;
}
inline int min(int x,int y)
{
return x<y ? x : y;
}
int ok(int val)
{
int i,j,nod,vec;
t=0;
for (i=1; i<=n; i++)
{
nod=st[i]; marc[nod]=0;
dist[nod]=INF; when[nod]=val;
for (j=0; j<A[nod].size(); j++)
{
vec=A[nod][j];
if (dad[vec]==nod)
{
dist[nod]=min(dist[nod],dist[vec]+1);
when[nod]=min(when[nod],when[vec]-1);
}
}
if (when[nod]>=dist[nod])
{
when[nod]=INF;
continue ;
}
if (nod==1 || when[nod]-1<0)
{
marc[nod]=1; t++;
dist[nod]=0; when[nod]=INF;
continue ;
}
}
return t<=k;
}
int cbin()
{
int i,step=(1<<10);
for (i=-1; step; step>>=1)
if (!ok(i+step))
i+=step;
return ++i;
}
void complete()
{
ok(rez);
int i,cnt=k-t;
for (i=1; i<=n && cnt; i++)
if (!marc[i])
marc[i]=1,cnt--;
printf("%d\n",rez);
for (i=1; i<=n; i++)
if (marc[i])
printf("%d ",i);
printf("\n");
}
int main()
{
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
read();
dfs(1);
rez=cbin();
complete();
return 0;
}