Pagini recente » Cod sursa (job #2563139) | Cod sursa (job #1642869) | Cod sursa (job #2031785) | Cod sursa (job #2969970) | Cod sursa (job #754785)
Cod sursa(job #754785)
#include<fstream>
#include<iostream>
#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],vec[DIM],stan[DIM],pus[DIM];
void catbin(int st,int dr);
void dfs(int k);
int ok(int val);
void test(int k,int val);
int max(int a,int b);
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);
for(i=1;i<=n;i++)
viz[i]=0;
catbin(1,n);
pune(sol);
if(sol<k)
for(i=1;i<=n&& s[0]<k;i++)
if(pus[i]==0)
s[++s[0]]=i;
fout<<sol<<"\n";
sort(s+1,s+s[0]+1);
for(i=1;i<=s[0];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 comp(int a,int b)
{
if(adan[a]<adan[b])
return 0;
return 1;
}
void test(int k,int val)
{
int i;
viz[k]=1;
for(i=0;i<G[k].size();++i)
if(viz[G[k][i]]==0)
test(G[k][i],val);
//cout<<k<<" "<<stan[k]<<" "<<t[k]<<endl;
if(stan[k]!=2*val)
{
if(stan[k]<val)
{
if(stan[t[k]]<=val)
stan[t[k]]=max(stan[k]+1,stan[t[k]]);
else
if(2*val-stan[t[k]]<=stan[k])
stan[t[k]]=stan[k]+1;
}
else
if(2*val-stan[k]>stan[t[k]])
stan[t[k]]=stan[k]+1;
}
else
stan[t[k]]=max(0,stan[t[k]]);
}
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
int ok(int val)
{
int i;
for(i=1;i<=n;i++)
viz[i]=0,stan[i]=0;
test(1,val);
int nr=0;
for(i=1;i<=n;i++)
if(stan[i]==val)
nr++;
if(stan[1]!=val && stan[1]<val)
nr++;
return nr<=k;
}
void pune(int val)
{
int i;
for(i=1;i<=n;i++)
viz[i]=0,stan[i]=0;
test(1,val);
int nr=0;
for(i=1;i<=n;i++)
if(stan[i]==val)
s[++s[0]]=i,pus[i]=1;
if(stan[1]!=val && stan[1]<val)
s[++s[0]]=1,pus[1]=1;
}