Pagini recente » Cod sursa (job #1386042) | Cod sursa (job #2308687) | Cod sursa (job #1226580) | Cod sursa (job #1014412) | Cod sursa (job #2817231)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("salvare.in");
ofstream fout("salvare.out");
const int NMAX = 1e3+3, KMAX = 303;
int mat[NMAX][NMAX]; // distanta dintre 2 noduri
int n, k;
vector <int> g[NMAX];
void DFS(int nod, int father, int depth, int start)
{
mat[start][nod] = mat[nod][start] = depth;
int i;
for(i = 0; i < g[nod].size(); ++i)
if(g[nod][i] != father)
DFS(g[nod][i], nod, depth+1, start);
}
void calc_dist()
{
int i;
for(i = 1; i <= n; ++i)
DFS(i, i, 0, i);
}
int sol = INT_MAX;
int min_glob[NMAX];
void init_min(int j, int &maxim, int &pmax)
{
maxim = -1;
int i;
for(i = 1; i <= n; ++i)
{
min_glob[i] = mat[i][j];
// maxim = max(maxim, mat[i][j]);
if(maxim < mat[i][j])
maxim = mat[i][j], pmax = i;
}
}
void adaug_min(int j, int &maxim, int &pmax)
{
maxim = -1;
int i;
for(i = 1; i <= n; ++i)
{
min_glob[i] = min(min_glob[i], mat[i][j]);
//maxim = max(maxim, mat[i][j]);
if(maxim < min_glob[i])
maxim = min_glob[i], pmax = i;
}
}
int afisare[KMAX];
void switch_sol(int x[])
{
int i;
for(i = 1; i <= k; ++i)
afisare[i] = x[i];
}
void afis()
{
fout << sol << '\n';
sort(afisare+1, afisare+1+k);
int i;
for(i = 1; i <= k; ++i)
fout << afisare[i] << ' ';
}
void solve()
{
int sqm[KMAX];
int i, ramas = k - 1, maxim, pmax;
for(i = 1; i <= n; ++i)
{
init_min(i, maxim, pmax);
sqm[k] = i;
while(ramas)
{
sqm[ramas] = pmax;
adaug_min(pmax, maxim, pmax);
--ramas;
}
//sol = min(sol, maxim);
if(sol > maxim)
{
sol = maxim;
switch_sol(sqm);
}
}
afis();
}
int main()
{
fin >> n >> k;
int i;
for(i = 1; i < n; ++i)
{
int a, b;
fin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
calc_dist();
solve();
return 0;
}