Pagini recente » Cod sursa (job #2834557) | Cod sursa (job #1929627) | Cod sursa (job #1172163) | Cod sursa (job #1960475) | Cod sursa (job #753894)
Cod sursa(job #753894)
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
const int INF = 0x3f3f3f3f;
int N, K;
vector<int> V[1002];
bool S[1002], put[1002];
int maxDist[1002], limit, used;
void Dfs(int x)
{
S[x] = true;
maxDist[x] = -INF;
int size = 0, minval = INF;
for (vector<int>::iterator it = V[x].begin(); it != V[x].end(); ++it)
if (!S[*it])
{
++size;
Dfs(*it);
minval = min(minval, maxDist[*it] + 1);
if (!put[x] && maxDist[*it] + 1 <= limit)
{
++used;
maxDist[x] = -limit - 1;
put[x] = true;
}
else if (!put[x])
maxDist[x] = max(maxDist[x], maxDist[*it] + 1);
}
//if (-minval + 1 >= maxDist[x])
// maxDist[x] = -minval;
if (size == 0)
maxDist[x] = 0;
}
bool Test(int x)
{
memset(S, 0, sizeof(S));
memset(put, 0, sizeof(put));
limit = x;
used = 0;
Dfs(1);
if (maxDist[1] >= 0)
{
++used;
put[1] = true;
}
if (used <= K) return true;
return false;
}
int main()
{
ifstream fin("salvare.in");
ofstream fout("salvare.out");
fin >> N >> K;
for (int i = 1, nod1, nod2; i < N; ++i)
{
fin >> nod1 >> nod2;
V[nod1].push_back(nod2);
V[nod2].push_back(nod1);
}
int step = 1 << 10, result;
for (result = step + 1; step; step >>= 1)
if (result - step > 0 && Test(result - step))
result -= step;
if (K >= N)
{
fout << "0\n";
for (int i = 1; i <= N; ++i)
fout << i << ' ';
fout << '\n';
fin.close();
fout.close();
return 0;
}
fout << result << '\n';
Test(result);
int know = K - used;
for (int i = 1; know && i <= N; ++i)
if (!put[i])
{
put[i] = true;
--know;
}
for (int i = 1; i <= N; ++i)
if (put[i])
fout << i << ' ';
fout << '\n';
fin.close();
fout.close();
}