Cod sursa(job #1513915)

Utilizator tudormaximTudor Maxim tudormaxim Data 30 octombrie 2015 11:11:40
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#include <vector>
#define pb push_back
using namespace std;
const int nmax = 1005;
const int inf = (1<<29);
vector <int> g[nmax];
int n, k, dad[nmax], st[nmax], top, sol, t;
bool viz[nmax], s[nmax];
int d[nmax], v[nmax];

void dfs(int nod)
{
    int i, son;
    viz[nod]=1;
    for(i=0; i<g[nod].size(); i++)
    {
        son=g[nod][i];
        if (!viz[son])
        {
            dad[son]=nod;
            dfs(son);
        }
    }
    st[++top]=nod;
}

bool ok(int x)
{
    int i, j, nod, son;
    t=0;
    for (i=1; i<=n; i++)
    {
        nod=st[i];
        s[nod]=0;
        d[nod]=inf;
        v[nod]=x;
        for(j=0; j<g[nod].size(); j++)
        {
            son=g[nod][j];
            if (dad[son]==nod)
            {
                d[nod]=min(d[nod], d[son]+1);
                v[nod]=min(v[nod], v[son]-1);
            }
        }
        if(v[nod]>=d[nod])
            v[nod]=inf;
        else if(nod==1 || v[nod]<=0)
        {
            s[nod]=1;
            d[nod]=0;
            v[nod]=inf;
            t++;
        }
    }
    if(t<=k) return true;
    return false;
}

int bin_search()
{
    int i, step=(1<<10);
    for (i=-1; step; step=step>>1)
        if (!ok(i+step))
            i=i+step;
    return i+1;
}

void solve()
{
    sol=bin_search();
    ok(sol);
    int i, cnt=k-t;
    for (i=1; i<=n && cnt; i++)
        if (!s[i])
        {
            s[i]=1;
            cnt--;
        }

   printf("%d\n", sol);
    for (i=1; i<=n; i++)
        if (s[i]) printf("%d ", i);
}

int main()
{
    freopen("salvare.in", "r", stdin);
    freopen("salvare.out", "w", stdout);
    int i, x, y;
    scanf("%d %d", &n, &k);
    for (i=1; i<n; i++)
    {
        scanf("%d %d", &x, &y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1);
    solve();
    fclose(stdin);
    fclose(stdout);
    return 0;
}