Pagini recente » Cod sursa (job #8321) | Cod sursa (job #3147174) | Cod sursa (job #1111230) | Cod sursa (job #1650762) | Cod sursa (job #71019)
Cod sursa(job #71019)
#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 1010
#define pb push_back
int n,k,sol,l;
int c[maxn],rez[maxn],g[maxn],grad[maxn],s[maxn],dist[maxn];
vector <int> a[maxn];
int works(int d)
{
memcpy(grad,g,sizeof(g));
memset(dist,0,sizeof(dist));
int i,j,aux,count=0;
l=0;
for (i=1;i<=n;i++)
if (grad[i]==1)
{
s[++l]=i;
dist[i]=d+1;
}
for (i=1;i<=l;i++)
{
if (dist[s[i]]==2*d+1)
{
dist[s[i]]=0;
c[++count]=s[i];
}
for (j=0;j<g[s[i]];j++)
{
aux=a[s[i]][j];
grad[aux]--;
if (grad[aux]==1) s[++l]=aux;
if (dist[s[i]]+1>dist[aux]) dist[aux]=dist[s[i]]+1;
}
}
if (dist[s[l]]>d)
{
c[++count]=s[l];
dist[s[l]]=0;
}
j=1;
for (i=count+1;i<=k;i++)
{
for (;j<=n && dist[j]==0;j++);
dist[j]=0;
c[i]=j;
}
return count;
}
int main()
{
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
scanf("%d %d ",&n,&k);
int front=0,middle,back=n,i,x,y;
for (i=1;i<n;i++)
{
scanf("%d %d ",&x,&y);
a[x].pb(y);
a[y].pb(x);
}
for (i=1;i<=n;i++) g[i]=a[i].size();
while (front<=back)
{
middle=(front+back)/2;
if (works(middle)<=k)
{
back=middle-1;
sol=middle;
memcpy(rez,c,sizeof(c));
}
else front=middle+1;
}
sort(rez+1,rez+k+1);
printf("%d\n",sol);
for (i=1;i<=k;i++) printf("%d ",rez[i]);
printf("\n");
return 0;
}