Pagini recente » Cod sursa (job #1653187) | Cod sursa (job #263296) | Cod sursa (job #2473070) | Cod sursa (job #3242597) | Cod sursa (job #1889441)
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
#define Nmax 1001
using namespace std;
ifstream f("salvare.in");
ofstream g("salvare.out");
int n,k,X[Nmax],nr,dist[Nmax],nrv[Nmax];
bool uz[Nmax],placed[Nmax];
vector<int> V[Nmax];
vector<pair<int,int> > C;
bool weCan(int x)
{
C.clear();
memset(uz,0,sizeof(uz));
for (int i=1;i<=n;i++)
{
nrv[i] = V[i].size();
if(V[i].size()==1)
{
C.push_back(make_pair(i,0));
uz[i] = 1;
}
}
nr = 0;
for (int i=0;i<C.size();i++)
{
int ok = 0;
if (C[i].second == x)
{
nr++;
X[nr] = C[i].first;
C[i].second = -x;
if(nr>k)
return 0;
}
for (int j=0;j<V[C[i].first].size();j++)
{
int now = V[C[i].first][j];
if (!uz[now])
{
ok = 1;
nrv[now]--;
dist[now] = max(dist[now],C[i].second+1);
if (nrv[now]==1)
{
uz[now] = 1;
C.push_back(make_pair(now,dist[now]));
}
}
}
}
return 1;
}
int main()
{
f>>n>>k;
for (int i=1;i<n;i++)
{
int x,y;
f>>x>>y;
V[x].push_back(y);
V[y].push_back(x);
}
int st=0,dr=n;
while (st<=dr)
{
int mij = (st+dr)/2;
if (weCan(mij))
dr=mij-1;
else
st=mij+1;
}
if (st==0 && k!=n)
st++;
g<<st<<'\n';
weCan(st);
if (nr<k)
{
memset(uz,0,sizeof(uz));
for (int i=1;i<=nr;i++)
uz[X[i]] = 1;
for (int i=C.size()-1;i>=0 && nr<k;i--)
if (uz[C[i].first]==0)
X[++nr] = C[i].first;
}
sort(X+1,X+nr+1);
for (int i=1;i<=nr;i++)
g<<X[i]<<' ';
return 0;
}