Cod sursa(job #1513899)

Utilizator tudormaximTudor Maxim tudormaxim Data 30 octombrie 2015 10:37:40
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <vector>
using namespace std;
const int inf = (1<<29);
const int nmax = 1005;
int n, k;
vector<int> g[nmax];
bool viz[nmax], s[nmax];
int d[nmax], limit, used;

ifstream fin ("salvare.in");
ofstream fout ("salvare.out");

void dfs(int dad)
{
    int son;
    viz[dad]=true;
    d[dad]=-inf;
    int dim=0, minn=inf;
    for(int i=0; i<g[dad].size(); i++)
    {
        son=g[dad][i];
        if(!viz[son])
        {
            dim++;
            dfs(son);
            minn=min(minn, d[son]+1);
            if (!s[dad] && d[son]>limit)
            {
                ++used;
                d[dad]=d[dad]-limit-1;
                s[dad]=true;
            }
            else if(!s[dad]) d[dad]=max(d[dad], d[son]+1);
        }
    }


    if(!s[dad] && -(minn+1)>=d[dad]) d[dad]=minn;
    if(dim==0) d[dad]=0;
}

bool test(int x)
{
    for(int i=1; i<=n; i++)
        viz[i]=s[i]=false;
    limit=x;
    used=0;
    dfs(1);
    if (d[1]>=0)
    {
         ++used;
         s[1]=true;
    }
    if (used<=k) return true;
    return false;
}

void case_1()
{
    fout << 0 << '\n';
        for (int i=1; i<=n; i++)
            fout << 1 << ' ';
        fout << '\n';

}

void case_2()
{
    int step = 1 << 10, sol, i, know;
    for(sol=step+1; step; step=step>>1)
        if(sol-step>0 && test(sol-step))
            sol=sol-step;

    fout << sol << '\n';
    test(sol);
    know=k-used;
    for(i=1; know && i<=n; i++)
        if (!s[i])
        {
            s[i]=true;
            know--;
        }
    for(i=1; i<=n; i++)
        if (s[i])
            fout << i << ' ';
    fout << '\n';
}

int main()
{
    int i, x, y;
    fin >> n >> k;
    for (i=1; i<=n; i++)
    {
        fin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    if (k>=n) case_1();
    else case_2();
    fin.close();
    fout.close();
    return 0;
}