Cod sursa(job #3148558)

Utilizator emazareMazare Emanuel emazare Data 2 septembrie 2023 16:37:55
Problema Salvare Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int Nmax = 1005, INF = 1000000000;
vector<int> L[Nmax];
int dp[Nmax],c[Nmax];
bool b[Nmax];

int dfs(int node, int father, int d){
    int nr = 0;
    for(int son : L[node]){
        if(son!=father)
            nr+=dfs(son, node, d);
    }
    int nmin = INF,nmax = -INF,cmax = -1;
    if(L[node].size() == 1){
        dp[node] = -1; b[node] = 0;
        c[node] = 1;
    }
    else{
        for(int son : L[node]){
            if(son!=father && dp[son]!=-1){
                nmin = min(nmin, dp[son]);
                nmax = max(nmax, dp[son]);
            }
            if(son!=father)
                cmax = max(cmax, c[son]);
        }
        if(nmin == INF){
            c[node] = cmax+1; b[node] = 0;
            dp[node] = -1;
            if(c[node]>d){
                dp[node] = 0; c[node] = -1;
                b[node] = 1;
                nr++;
            }
        }
        else if((nmax == 2*d) || (node == 1 && nmax+nmin>=2*d) || (cmax+1>d)){
            dp[node] = 0; c[node] = -1;
            b[node] = 1;
            nr++;
        }
        else{
            dp[node] = nmin+1;  b[node] = 0;
            if(cmax>-1)
                c[node] = cmax+1;
            else
                c[node] = -1;
        }
    }
    return nr;
}

int main()
{
    int n,k,i,st,dr,mid,sol,nr;
    fin >> n >> k;
    for(i=1;i<n;i++){
        int x,y;
        fin >> x >> y;
        L[x].push_back(y);
        L[y].push_back(x);
    }
    L[1].push_back(0);
    st = 1; dr = n; sol = n;
    while(st<=dr){
        mid = (st+dr)/2;
        nr = dfs(1,0,mid);
        if(nr<=k){
            sol = mid;
            dr = mid-1;
        }
        else
            st = mid+1;
    }
    fout << sol << '\n';
    nr = dfs(1,0,sol);
    nr = 0;
    for(i=1;i<=n;i++){
        if(b[i] == 1)
            nr++;
    }
    nr = k-nr;
    for(i=1;i<=n;i++){
        if((b[i] == 1) || (b[i] == 0 && nr>0)){
            fout << i << " ";
            if(b[i] == 0)
                nr--;
        }
    }
    return 0;
}