Pagini recente » Cod sursa (job #381969) | Cod sursa (job #2924280) | Cod sursa (job #1071215) | Cod sursa (job #971966) | Cod sursa (job #218494)
Cod sursa(job #218494)
#include <stdio.h>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
#define maxn 1010
#define pb push_back
int n,k,d,sum,sol,l;
vector <int> a[maxn];
int g[maxn],used[maxn];
int c[maxn],c2[maxn],v[maxn],p[maxn];
int rez[maxn],s[maxn];
void DFS(int nod)
{
int i,found=0;
l++;
used[nod]=l;
for (i=0;i<g[nod];i++)
if (used[a[nod][i]]==0)
{
found=1;
DFS(a[nod][i]);
if (c[a[nod][i]]+1>c[nod])
{
c2[nod]=c[nod];
c[nod]=c[a[nod][i]]+1;
p[nod]=a[nod][i];
}
else if (c[a[nod][i]]+1>c2[nod]) c2[nod]=c[a[nod][i]]+1;
v[nod]|=v[a[nod][i]];
}
for (i=0;i<g[nod];i++)
if ((used[a[nod][i]]>used[nod]) && (v[a[nod][i]]))
{
if ((a[nod][i]!=p[nod]))
{
if ((c[nod]>c[a[nod][i]]+1) && (c[nod]+c[a[nod][i]]<=2*d)) c[nod]=c[a[nod][i]]+1;
}
else if ((c[nod]>c[a[nod][i]]+1) && (c2[nod]+c[a[nod][i]]<=2*d)) c[nod]=c[a[nod][i]]+1;
}
if (!found) c[nod]=d+1;
if (c[nod]==2*d+1)
{
c[nod]=0;
v[nod]=1;
s[++sum]=nod;
}
l--;
}
int works()
{
sum=0;
memset(used,0,sizeof(used));
memset(v,0,sizeof(v));
memset(c,0,sizeof(c));
memset(c2,0,sizeof(c2));
int i,j;
DFS(1);
if (c[1]>d)
{
s[++sum]=1;
c[1]=0;
}
j=1;
for (i=sum+1;i<=k;i++)
{
for (;c[j]==0;j++);
s[i]=j;
c[j]=0;
}
/* printf("%d\n",sum);
printf("%d: ",d);
for (int i=1;i<=n;i++) printf("%d ",c[i]);
printf("\n");*/
return sum;
}
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)
{
d=(front+back)/2;
if (works()<=k)
{
sol=d;
memcpy(rez,s,sizeof(s));
back=d-1;
}
else front=d+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;
}