Cod sursa(job #2099478)

Utilizator giotoPopescu Ioan gioto Data 4 ianuarie 2018 14:21:11
Problema Salvare Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

int n, k, NR;
bool viz[1005];
int GR[1005], gr[1005], d[1005], Sol[1005];
vector <int> v[1005];
queue <int> q;
inline bool check(int T){
    for(int i = 1; i <= n ; ++i){
        gr[i] = GR[i]; d[i] = -1;
        if(GR[i] == 1) q.push(i), d[i] = 0;
    }
    NR = 0;
    while(!q.empty()){
        int nod = q.front(); q.pop();
        if(d[nod] == T) {d[nod] = 0, ++NR; Sol[NR] = nod;}
        for(vector <int> :: iterator it = v[nod].begin(); it != v[nod].end() ; ++it){
            --gr[*it];
            d[*it] = max(d[*it], d[nod] + 1);
            if(gr[*it] == 1) q.push(*it);
        }
    }
    if(NR <= k) return 1;
    return 0;
}
int main()
{
    freopen("salvare.in", "r", stdin);
    freopen("salvare.out", "w", stdout);
    scanf("%d%d", &n, &k);
    int x, y;
    for(int i = 1; i < n ; ++i){
        scanf("%d%d", &x, &y);
        v[x].push_back(y);
        v[y].push_back(x);
        ++GR[x]; ++GR[y];
    }
    int st = 1, dr = n;
    while(st <= dr){
        int mij = (st + dr) / 2;
        if(check(mij)) dr = mij - 1;
        else st = mij + 1;
    }
    printf("%d\n", st);
    int dif = k - NR;
    for(int i = 1; i <= n && dif > 0 ; ++i){
        if(viz[i]) continue ;
        Sol[++NR] = i;
        --dif;
    }
    sort(Sol + 1, Sol + NR + 1);
    for(int i = 1; i <= NR ; ++i)
        printf("%d ", Sol[i]), viz[Sol[i]] = 1;
    return 0;
}