Cod sursa(job #1729602)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 15 iulie 2016 11:51:37
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define MAXN 1010
#define INF 1000000000
using namespace std;
vector<int> g[MAXN];
vector<int> temp,solution;
int n,k,required,limit;
int dp[MAXN],taken[MAXN];
void DFS(int node,int father){
    int i,best=INF;
    for(i=0;i<g[node].size();i++)
        if(g[node][i]!=father){
            DFS(g[node][i],node);
            dp[node]=max(dp[node],dp[g[node][i]]+1);
            best=min(best,dp[g[node][i]]+1);
        }
    if(dp[node]==limit){
        required++;
        temp.push_back(node);
        dp[node]=-limit-1;
        return;
    }
    if(best<0&&-best-1>=dp[node])
        dp[node]=best;
}
bool Check(int value){
    required=0;
    memset(dp,0,sizeof(dp));
    temp.clear();
    limit=value;
    DFS(1,0);
    if(dp[1]>=0){
        required++;
        temp.push_back(1);
    }
    if(required<=k)
        return true;
    return false;
}
int main(){
    freopen("salvare.in","r",stdin);
    freopen("salvare.out","w",stdout);
    int i,a,b,left,right,middle,answer;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n-1;i++){
        scanf("%d%d",&a,&b);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    left=0;
    right=n;
    while(left<=right){
        middle=(left+right)/2;
        if(Check(middle)==true){
            answer=middle;
            right=middle-1;
            solution=temp;
        }
        else
            left=middle+1;
    }
    printf("%d\n",answer);
    for(i=0;i<solution.size();i++)
        taken[solution[i]]=1;
    for(i=1;i<=n;i++)
        if(taken[i]==1)
            printf("%d ",i);
        else
            if(k>solution.size()){
                k--;
                printf("%d ",i);
            }
    return 0;
}