Cod sursa(job #2291806)

Utilizator bogdi1bogdan bancuta bogdi1 Data 28 noiembrie 2018 17:36:28
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> g[1005];
int dist[1005];
vector <int> ans;
vector <int> sol;
bool f[1005];
const int INF = 2000000000;
void cpy()
{
    sol.clear();
    int i;
    for(i=0; i<ans.size(); i++)
        sol.push_back(ans[i]);
}
void dfs(int nod, int father, int salv)
{
    int negative=INF,pozitive=-1;
    for(int i=0; i<g[nod].size(); i++)
        if(g[nod][i]!=father){
            dfs(g[nod][i], nod, salv);
            if(dist[g[nod][i]]<0)
                negative=min(negative, dist[g[nod][i]]);
            else
                pozitive=max(pozitive, dist[g[nod][i]]);
        }
    if(pozitive==-1){
        if(negative==INF)
            dist[nod]=0;
        else
            dist[nod]=negative+1;
    }
    else{
        if(pozitive+1<=-negative-2)
            dist[nod]=negative+1;
        else
            dist[nod]=pozitive+1;
    }
    if(dist[nod]==salv || (!father && dist[nod]>=0)){
        ans.push_back(nod);
        dist[nod]=-salv-1;
    }
}
int main()
{   freopen("salvare.in", "r",stdin);
    freopen("salvare.out", "w",stdout);
    int n,k,i,x,y,st,dr,med,soll;
    scanf("%d%d", &n, &k);
    for(i=1; i<n; i++){
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    st=0;
    dr=n-1;
    while(st<=dr){
        med=(st+dr)/2;
        ans.clear();
        dfs(1, 0, med);
        if(ans.size()<=k){
            dr=med-1;
            soll=med;
            cpy();
        }
        else
            st=med+1;
    }
    printf("%d\n", soll);
    for(i=0; i<sol.size(); i++)
        f[sol[i]]=1;
    for(i=1; i<=n && sol.size()<k; i++)
        if(f[i]==0)
            sol.push_back(i);
    sort(sol.begin(), sol.end());
    for(i=0; i<sol.size(); i++)
        printf("%d ", sol[i]);
    return 0;
}