Pagini recente » Cod sursa (job #1360068) | Cod sursa (job #2058805) | Cod sursa (job #233579) | Cod sursa (job #3234540) | Cod sursa (job #644407)
Cod sursa(job #644407)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define INF 1000000005
#define pb push_back
#define minim(a,b) (a<b ? a : b)
#define maxim(a,b) (a>b ? a : b)
#define NMAX 1005
vector<int> v[NMAX],rec,rsol;
int nr,n,k,st,dr,mij;
int h[NMAX],sol,t;
char viz[NMAX];
char f[NMAX];
void dfs(int nod)
{
int i,vec,lim=v[nod].size();
viz[nod]=1;
int thefar=0,ok=0;
int theclose=0;
for(i=0;i<lim;i++)
if(!viz[vec=v[nod][i]])
{
dfs(vec);
thefar=maxim(thefar,h[vec]);
theclose=minim(theclose,h[vec]);
ok=1;
}
if(!ok)
{
h[nod]=1;
}
if(theclose*-1>=thefar)
h[nod]=theclose+1;
else
{
h[nod]=thefar+1;
if(nod==1 || h[nod]==t+1)
{
h[nod]=-t+1;
nr++;
rec.pb(nod);
}
}
}
int merge(int val)
{
t=val;
nr=0;
memset(viz,0,sizeof(viz));
memset(h,0,sizeof(h));
rec.clear();
dfs(1);
return (nr<=k);
}
int main ()
{
int i,a,b,cp;
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
scanf("%d%d",&n,&k);
if(n==k)
{
printf("0\n");
for(i=1;i<=n;i++)
printf("%d ",i);
return 0;
}
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
v[a].pb(b);
v[b].pb(a);
}
st=1;dr=n;
while(st<=dr)
{
mij=(st+dr)/2;
if(merge(mij))
{
sol=mij;
dr=mij-1;
rsol.clear();
for(i=0;i<rec.size();i++)
rsol.pb(rec[i]);
}
else
st=mij+1;
/* printf("Pentru mij=%d nr=%d am:",mij,nr);
for(i=1;i<=n;i++)
printf("%d ",h[i]);
printf("\n");*/
}
printf("%d\n",sol);
cp=k-(rsol.size());
for(i=0;i<rsol.size();i++)
f[rsol[i]]=1;
for(i=1;i<=n;i++)
if(cp && !f[i])
{
f[i]=1;
cp--;
}
for(i=1;i<=n;i++)
if(f[i])
printf("%d ",i);
printf("\n");
return 0;
}