Cod sursa(job #2245988)

Utilizator DawlauAndrei Blahovici Dawlau Data 26 septembrie 2018 12:49:18
Problema Salvare Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <list>
#include <bitset>
#include <algorithm>
#include <vector>
#include <climits>

using namespace std;

const int maxV = 1000;
const int Inf = INT_MAX;

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

list <int> adjList[1 + maxV];

bitset <1 + maxV> marked;
bitset <1 + maxV> sol;

vector <int> dist;

int V, E, K;

void resizeVectors(){

    dist.resize(1 + V);
}

void DFS(int node, int father, int currDist){

    for(const int &nextNode : adjList[node])
        if(nextNode != father){

            DFS(nextNode, node, currDist);
            dist[node] = min(dist[node], dist[nextNode] - 1);
        }

    if(adjList[node].size() == 1)
        dist[node] = currDist;
    else if(dist[node] == 0){

        dist[node] = currDist;
        marked[node] = true;
    }
}

inline int check(const int &currDist){

    fill(dist.begin(), dist.end(), Inf);
    marked.reset();

    DFS(1, 0, currDist);

    int usedNodes = 0;
    for(int node = 1; node <= V; ++node)
        if(marked[node])
            ++usedNodes;

    return usedNodes;
}

int main(){

    fin >> V >> K;
    E = V - 1;

    resizeVectors();

    for(; E; --E){

        int from, to;
        fin >> from >> to;

        adjList[from].push_back(to);
        adjList[to].push_back(from);
    }

    int low = 1, high = V - 1;
    int ans = 0, usedNodes = 0;

    while(low <= high){

        int mid = (low + high) / 2;
        int checker = check(mid);

        if(checker <= K){

            ans = mid;
            usedNodes = checker;
            high = mid - 1;

            for(int node = 1; node <= V; ++node)
                sol[node] = marked[node];
        }
        else low = mid + 1;
    }

     fout << ans << '\n';

    K -= usedNodes;
    for(int node = 1; K; ++node)
        if(!sol[node]){

            sol[node] = true;
            --K;
        }

    for(int node = 1; node <= V; ++node)
        if(sol[node] == true)
            fout << node << ' ';
}