Cod sursa(job #2418335)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 4 mai 2019 17:00:18
Problema Salvare Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("salvare.in");
ofstream out("salvare.out");
const int N = 1e3+5;
int dist[N],n,k;
bool placed[N];
bool ok;
vector<int> v[N],ans;
void dfs(int x, int p)
{
    for (auto it: v[x])
    {
        if (!dist[it])
        {
            dist[it] = 1+dist[x];
            if ((dist[it]-1)%p == 0)
                placed[it] = 1;
            dfs(it,p);
        }
    }
}
void Try(int x)
{
    for (int i = 1; i<=n; i++)
    {
        memset(placed,0,sizeof(placed));
        memset(dist,0,sizeof(dist));
        placed[i] = 1;
        dist[i] = 1;
        dfs(i,x);
        int cnt = 0;
        for (int j = 1; j<=n; j++)
            cnt+=placed[j];
        if (cnt<=k)
        {
            ok = 1;
            return;
        }
    }
}
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;
        ok = 0;
        Try(mj);
        if (ok)
        {
            Max = mj;
            Update();
            dr = mj-1;
        }
        else
            st = mj+1;
    }
    out << Max-1 << "\n";
    sort(ans.begin(),ans.end());
    for (auto it: ans)
        out << it << " ";
}