Cod sursa(job #1799673)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 6 noiembrie 2016 17:15:16
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("salvare.in");
ofstream g("salvare.out");
const int inf=1<<30;
int n,k,x,y,dist,cur,dp[1<<10];
vector<int> V[1<<10],sol,vec;
bool viz[1<<10];
void dfs(int X, int Y) {
    int minim = inf;
    for (vector<int>::iterator adj = V[X].begin(); adj != V[X].end(); ++adj) {
        if (*adj == Y) continue;
        dfs(*adj, X);
        dp[X] = max(dp[X], dp[*adj] + 1);
        minim = min(minim, dp[*adj] + 1);
    }
    if (dp[X]==dist) {
        ++cur;
        vec.push_back(X);
        dp[X]=-dist-1;
        return;
    }
    if(minim<0&&-minim-1>=dp[X]) dp[X]=minim;
}
bool verif(int distt) {
    dist=distt,cur=0;
    vec.clear();
    memset(dp, 0, sizeof dp);
    dfs(1,0);
    if(dp[1]>=0) {
        ++cur;
        vec.push_back(1);
    }
    return (cur<=k);
}
int main() {
    f >> n >> k;
    for (int i = 1; i < n; ++i) {
        f >> x >> y;
        V[x].push_back(y);
        V[y].push_back(x);
    }
    int left=0,right=n,ans=0;
    while(left<=right) {
        int mid=(left+right)>>1;
        if (verif(mid)) {
            ans=mid;
            sol=vec;
            right=mid-1;
        }
        else left=mid+1;
    }
    g<<ans<<'\n';
    sort(sol.begin(),sol.end());
    for(int i=0;i<sol.size();++i) viz[sol[i]]=1;
    k -= sol.size();
    for(int i=1;i<=n;++i)
        if(viz[i]) g<<i<<' ';
        else if(k>0){
            --k;
            g<<i<<' ';
        }
    return 0;
}