Cod sursa(job #2390401)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 27 martie 2019 23:51:05
Problema Salvare Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define DIM 1010
#define INF 1e9

using namespace std;

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

int n, k, used, ok, dst, x, y;
int dp[DIM];

bool viz[DIM], ambulance[DIM];

vector<int> arb[DIM];

void dfs(int node, int father){
    viz[node] = true;
    if(arb[node].size() == 1 && arb[node].front() == father){
        dp[node] = dst;
        return;
    }
    for(auto nextNode : arb[node]){
        if(viz[nextNode])
            continue;
        dfs(nextNode, node);
    }
    if(ok == 0)
        return;
    int crt = INF;
    for(auto nextNode : arb[node]){
        if(nextNode == father)
            continue;
        crt = min(crt, dp[nextNode] - 1);
    }
    dp[node] = crt;
    if(crt == 0){
        if(used == k){
            ok = 0;
            return;
        }
        ++ used;
        ambulance[node] = true;
        dp[node] = 2 * dst - 1;
    }
}

bool calc(int dist){
    used = 0;
    ok = 1;
    dst = dist;
    for(int i = 1; i <= n; ++ i){
        viz[i] = false;
        ambulance[i] = false;
        dp[i] = 0;
    }
    dfs(1, 0);
    return ok;
}

int main()
{
    in>>n>>k;
    for(int i = 1; i < n; ++ i){
        in>>x>>y;
        arb[x].push_back(y);
        arb[y].push_back(x);
    }
    int st = 1, dr = n, ans = n;

    while(st <= dr){
        int mid = (st + dr) / 2;
        if(calc(mid)){
            dr = mid - 1;
            ans = mid;
        }
        else{
            st = mid + 1;
        }
    }

    calc(ans);

    out<<ans<<'\n';
    int nr = 0;
    for(int i = 1; i <= n; ++ i){
        if(ambulance[i] == true)
            ++ nr;
    }
    for(int i = 1; i <= n && nr < k; ++ i){
        if(ambulance[i] == 0){
            ambulance[i] = true;
            ++ nr;
        }
    }
    for(int i = 1; i <= n; ++ i){
        if(ambulance[i] == true)
            out<<i<<" ";
    }

    return 0;
}