Pagini recente » Cod sursa (job #1667407) | Cod sursa (job #130230) | Cod sursa (job #675582) | Cod sursa (job #786702) | Cod sursa (job #2245542)
#include <bits/stdc++.h>
#define Nmax 1005
using namespace std;
ifstream f("salvare.in");
ofstream g("salvare.out");
int n,k;
list <int> G[Nmax];
queue < pair<int,int> > q;
int nr_ans;
bitset <Nmax> solution;
bitset <Nmax> s;
bitset <Nmax> viz;
void set_bitset()
{
nr_ans=0;
for(int i=1;i<=n;i++)
{
solution[i]=s[i];
if(s[i]) ++nr_ans;
}
}
bool sol_valid(int dist)
{
int i,nr_saves=0;
while(!q.empty())
q.pop();
viz.reset();
s.reset();
for(i=1;i<=n;i++)
if((int)G[i].size()==1)
{
q.push({i,dist});
viz[i]=true;
}
int x,y;
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop();
viz[x]=true;
if(!y)
{
++nr_saves;
s[x]=true;
y=dist;
}
if(nr_saves>k) return false;
for(const auto &it:G[x])
if(!viz[it])
{
viz[it]=true;
q.push({it,y-1});
}
}
return true;
}
int main()
{
int x,y,i;
f>>n>>k;
for(i=1;i<n;i++)
{
f>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
int lo=1,hi=n-1,mid,ans=n-1;
while(lo<=hi)
{
mid=(lo+hi)>>1;
if(sol_valid(mid))
{
ans=mid;
set_bitset();
hi=mid-1;
}
else lo=mid+1;
}
g<<ans<<'\n';
if(nr_ans<k)
{
i=1;
while(nr_ans<k)
{
while(solution[i]) i++;
solution[i]=true;
nr_ans++;
}
}
for(i=1;i<=n;i++)
if(solution[i]) g<<i<<' ';
return 0;
}