Pagini recente » Cod sursa (job #70090) | Cod sursa (job #701023) | Cod sursa (job #2156664) | Cod sursa (job #2603807) | Cod sursa (job #754609)
Cod sursa(job #754609)
#include<fstream>
#include<algorithm>
#include<vector>
#include<queue>
#define DIM 1003
#define pb push_back
using namespace std;
vector<int>G[DIM];
priority_queue<int>Q;
int n,k,t[DIM],viz[DIM],adan[DIM],nod[DIM],sol=2147000,h,s[304];
void umplere(int k,int ac,int mx);
void catbin(int st,int dr);
void dfs(int k);
int comp(int a,int b);
int ok(int val);
void pune(int val);
int main()
{
ifstream fin("salvare.in");
ofstream fout("salvare.out");
int i;
fin>>n>>k;
for(i=1;i<n;i++)
{
int a,b;
fin>>a>>b;
G[a].pb(b);
G[b].pb(a);
nod[i]=i;
}
nod[n]=n;
dfs(1);
sort(nod+1,nod+n+1,comp);
catbin(1,n);
pune(sol);
sort(s+1,s+h+1);
fout<<sol<<"\n";
for(i=1;i<=h;i++)
fout<<s[i]<<" ";
return 0;
}
void catbin(int st,int dr)
{
if(st==dr)
{
if(ok(st)==1)
sol=st;
return;
}
int mij=(st+dr)/2;
if(ok(mij)==1)
{
if(mij<sol)
sol=mij;
catbin(st,mij);
}
else
catbin(mij+1,dr);
}
void dfs(int k)
{
viz[k]=1;
int i;
for(i=0;i<G[k].size();++i)
if(viz[G[k][i]]==0)
{
adan[G[k][i]]=adan[k]+1;
t[G[k][i]]=k;
dfs(G[k][i]);
}
}
int ok(int val)
{
int i,j;
int nr=0;
for(i=1;i<=n;i++)
viz[i]=0;
for(i=1;i<=n;i++)
{
if(viz[nod[i]]==0)
{
int nd=nod[i];
for(j=1;j<=val;j++)
nd=t[nd];
nr++;
if(nd==0)
nd=1;
umplere(nd,0,val);
}
}
return nr<=k;
}
void umplere(int k,int ac,int mx)
{
if(ac<=mx)
{
viz[k]=1;
int i;
for(i=0;i<G[k].size();i++)
if(viz[G[k][i]]==0)
umplere(G[k][i],ac+1,mx);
}
}
int comp(int a,int b)
{
if(adan[a]<adan[b])
return 0;
return 1;
}
void pune(int val)
{
int i,j;
int nr=0;
for(i=1;i<=n;i++)
viz[i]=0;
for(i=1;i<=n;i++)
{
if(viz[nod[i]]==0)
{
int nd=nod[i];
for(j=1;j<=val;j++)
nd=t[nd];
nr++;
if(nd==0)
nd=1;
s[++h]=nd;
umplere(nd,0,val);
}
}
}