Cod sursa(job #3143035)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 27 iulie 2023 11:35:54
Problema Salvare Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <vector>

using namespace std;

const int Nmax = 1005;

int n, k, salvari;
int dist[Nmax];
vector<int> arbore[Nmax];

void dfs(int nod, int parinte, int dst){
    for(int fiu : arbore[nod]){
        if(fiu == parinte){
            continue;
        }
        dfs(fiu, nod, dst);

        dist[nod] = max(dist[nod], dist[fiu] + 1);
    }
    if(arbore[nod].size() == 1){
        dist[nod] = dst + 1;
        return;
    }

    if(dist[nod] >= 2 * dst + 1){
        salvari++;
        dist[nod] = 0;
    }
}

bool isPossible(int dst){
    for(int i = 1; i <= n; i++){
        dist[i] = 0;
    }

    salvari = 0;
    dfs(1, 0, dst);

    return (salvari <= k);
}

int main()
{
    ifstream fin("salvare.in");
    ofstream fout("salvare.out");

    int a, b, sol, lft, rgt, mid;

    fin >> n >> k;

    for(int i = 1; i < n; i++){
        fin >> a >> b;

        arbore[a].push_back(b);
        arbore[b].push_back(a);
    }

    lft = 1;
    rgt = Nmax;
    sol = -1;
    while(lft <= rgt){
        mid = (lft + rgt) / 2;

        if(isPossible(mid)){
            sol = mid;
            rgt = mid - 1;
        }
        else{
            lft = mid + 1;
        }
    }

    fout << sol << '\n';

    isPossible(sol);

    if(k >= n){
        fout << 0 << '\n';
        for(int i = 1; i <= n; i++){
            fout << i << " ";
        }
    }

    for(int i = 1; i <= n; i++){
        if(dist[i] == 0){
            fout << i << " ";
        }
    }

    return 0;
}