Cod sursa(job #2418374)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 4 mai 2019 19:13:22
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("salvare.in");
ofstream out("salvare.out");
const int N = 1e3+5;
int dp[N],n,k;
bool placed[N];
vector<int> v[N],ans;
void dfs(int x, int u, int p)
{
    int Min = 2*n;
    for (auto it: v[x])
        if (it!=u)
        {
            dfs(it,x,p);
            dp[x] = max(dp[x],1+dp[it]);
            Min = min(Min,1+dp[it]);
        }
    if (dp[x] == p)
    {
        placed[x] = 1;
        dp[x] = -p-1;
    }
    else if (Min<0 && -(Min+1)>=dp[x])
        dp[x] = Min;
}
void Update()
{
    ans.clear();
    int cnt = k;
    for (int i = 1; i<=n; i++)
        if (placed[i])
        {
            ans.push_back(i);
            cnt--;
        }
    for (int i = 1; i<=n; i++)
    {
        if (!cnt)
            break;
        if (!placed[i])
        {
            ans.push_back(i);
            cnt--;
        }
    }
}
int main()
{
    in >> n >> k;
    for (int i = 1; i<n; i++)
    {
        int x,y;
        in >> x >> y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    int st = 1, dr = n,Max = -1;
    while (st<=dr)
    {
        int mj = (st+dr)/2, cnt = 0;
        memset(dp,0,sizeof(dp));
        memset(placed,0,sizeof(placed));
        dfs(1,0,mj);
        if (dp[1]>=0)
            placed[1] = 1;
        for (int i = 1; i<=n; i++)
            if (placed[i])
                cnt++;
        if (cnt<=k)
        {
            Max = mj;
            Update();
            dr = mj-1;
        }
        else
            st = mj+1;
    }
    out << Max << "\n";
    sort(ans.begin(),ans.end());
    for (auto it: ans)
        out << it << " ";
}