Cod sursa(job #2817231)

Utilizator Stefan_DomuncoStefan Domunco Stefan_Domunco Data 13 decembrie 2021 12:04:15
Problema Salvare Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#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;
}