Pagini recente » Cod sursa (job #109381) | Cod sursa (job #2749501) | Cod sursa (job #2619911) | Cod sursa (job #1734902) | Cod sursa (job #2418335)
#include <bits/stdc++.h>
using namespace std;
ifstream in("salvare.in");
ofstream out("salvare.out");
const int N = 1e3+5;
int dist[N],n,k;
bool placed[N];
bool ok;
vector<int> v[N],ans;
void dfs(int x, int p)
{
for (auto it: v[x])
{
if (!dist[it])
{
dist[it] = 1+dist[x];
if ((dist[it]-1)%p == 0)
placed[it] = 1;
dfs(it,p);
}
}
}
void Try(int x)
{
for (int i = 1; i<=n; i++)
{
memset(placed,0,sizeof(placed));
memset(dist,0,sizeof(dist));
placed[i] = 1;
dist[i] = 1;
dfs(i,x);
int cnt = 0;
for (int j = 1; j<=n; j++)
cnt+=placed[j];
if (cnt<=k)
{
ok = 1;
return;
}
}
}
void Update()
{
ans.clear();
int cnt = k;
for (int i = 1; i<=n; i++)
if (placed[i])
{
ans.push_back(i);
cnt--;
}
for (int i = 1; i<=n; i++)
{
if (!cnt)
break;
if (!placed[i])
{
ans.push_back(i);
cnt--;
}
}
}
int main()
{
in >> n >> k;
for (int i = 1; i<n; i++)
{
int x,y;
in >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
int st = 1, dr = n,Max = -1;
while (st<=dr)
{
int mj = (st+dr)/2;
ok = 0;
Try(mj);
if (ok)
{
Max = mj;
Update();
dr = mj-1;
}
else
st = mj+1;
}
out << Max-1 << "\n";
sort(ans.begin(),ans.end());
for (auto it: ans)
out << it << " ";
}