Pagini recente » Cod sursa (job #2438527) | Cod sursa (job #2964927) | Cod sursa (job #109246) | Cod sursa (job #2063242) | Cod sursa (job #1348163)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int K, ap[1009];
class tree
{
public:
int N;
void add_edge (int x, int y)
{
edges[x].push_back (y);
edges[y].push_back (x);
}
void init ()
{
T[1] = -1;
dfs (1);
for (int i=1; i<=N; i++)
ordine[i].first = -niv[i], ordine[i].second = i;
sort (ordine + 1, ordine + N + 1);
}
vector < int > answer (int K)
{
vector < int > ans;
init_dp (K);
for (int i=1; i<=N; i++)
if (dp[ordine[i].second] > K)
{
int special_node;
special_node = ordine[i].second;
for (int j=1; j<=K; j++)
{
if (special_node == 1)
break;
special_node = T[special_node];
}
dp[special_node] = 0;
refresh (special_node);
ans.push_back (special_node);
}
return ans;
}
private:
vector < int > edges[1009];
pair < int , int > ordine[1009];
int niv[1009], dp[1009], T[1009];
void dfs (int nod)
{
for (vector < int > :: iterator it = edges[nod].begin(); it != edges[nod].end(); it ++)
if (T[*it] == 0)
{
T[*it] = nod;
niv[*it] = niv[nod] + 1;
dfs (*it);
}
}
void init_dp (int K)
{
for (int i=1; i<=N; i++)
dp[i] = K + 3;
}
void refresh (int nod)
{
for (vector < int > :: iterator it = edges[nod].begin(); it != edges[nod].end(); it ++)
if (dp[nod] + 1 < dp[*it])
{
dp[*it] = dp[nod] + 1;
refresh (*it);
}
}
}arb;
bool ok (int max_dist)
{
vector < int > curr_ans = arb.answer (max_dist);
return (curr_ans.size() <= K);
}
int main()
{
freopen ("salvare.in", "r", stdin);
freopen ("salvare.out", "w", stdout);
scanf ("%d %d", &arb.N, &K);
for (int i=1; i<arb.N; i++)
{
int x, y;
scanf ("%d %d", &x, &y);
arb.add_edge (x, y);
}
arb.init();
int p, u, mij, ras;
p = 1;
u = arb.N;
while (p <= u)
{
mij = (p + u) >> 1;
if (ok (mij))
ras = mij, u = mij - 1;
else
p = mij + 1;
}
vector < int > ans = arb.answer (ras);
for (vector < int > :: iterator it = ans.begin(); it != ans.end(); it ++)
ap[*it] = 1, K --;
for (int i=1; i<=arb.N; i++)
if (K && ap[i] == 0)
K --, ap[i] = 1;
printf ("%d\n", ras);
for (int i=1; i<=arb.N; i++)
if (ap[i])
printf ("%d ", i);
return 0;
}