Cod sursa(job #2398417)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 5 aprilie 2019 14:23:13
Problema Salvare Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<bits/stdc++.h>
using namespace std;


const int maxN=(1e3+5);
vector<int> v[maxN];
vector<int> points;
int dp[maxN];
bool p[maxN];
int n,k;
void dfs(int nod,int fat,int d)
{
    dp[nod]=d;

    for(auto it:v[nod])
    {
        if(it==fat) continue;
        dfs(it,nod,d);
        dp[nod]=min(dp[nod],dp[it]-1);
    }

    if(!dp[nod])
    {
        points.push_back(nod);
        p[nod]=1;
        dp[nod]=2*d+1;
    }

}
inline int f(int val)
{
    memset(dp,0,sizeof(dp));
    points.clear();
    memset(p,0,sizeof(p));
    deque<int> q,q2;

    dfs(1,0,val);

    if((int)points.size()>k) return 0;

    for(int i=1;i<=n;i++)
        if(!p[i]) q.push_back(i);
            else q2.push_back(i);

        while((int)points.size()<k)
        {
            int nod;
            if(!q.empty()) {
                nod = q.front();
                q.pop_front();
            }
                else
            {
               nod=q2.front();
               q2.pop_front();
            }

            points.push_back(nod);
        }
    return k;

}

int main()
{
    freopen("salvare.in","r",stdin);
    freopen("salvare.out","w",stdout);

    scanf("%d%d",&n,&k);

    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }

    int sol=0;
    int st=1,dr=n;
    while(st<=dr)
    {
        int mid=(st+dr)>>1;
        if(f(mid)==k)
        {
            sol=mid;
            dr=mid-1;
        }
            else
        {
            st=mid+1;
        }
    }


    int x=f(sol);

    printf("%d\n",sol);

    sort(points.begin(),points.end());

    for(auto it:points)
        printf("%d ",it);

    printf("\n");

    return 0;

}