Cod sursa(job #1399858)

Utilizator george_stelianChichirim George george_stelian Data 24 martie 2015 22:40:42
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> v[1010];
int niv[1010],tata[1010],d[1010],v1[1010],sol[1010],nr,n;
char vaz[1010];

void dfs(int nod)
{
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
        if(!niv[*it])
        {
            niv[*it]=niv[nod]+1;
            tata[*it]=nod;
            dfs(*it);
        }
}

int cmp(int a,int b)
{
    return niv[a]>niv[b];
}

void dfs1(int nod)
{
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
        if(d[nod]+1<d[*it])
        {
            d[*it]=d[nod]+1;
            dfs1(*it);
        }
}

void solve(int k)
{
    nr=0;
    for(int i=1;i<=n;i++) d[i]=k+1;
    for(int i=1;i<=n;i++)
        if(d[v1[i]]>k)
        {
            int nod=v1[i];
            for(int j=1;j<=k && nod>1;j++) nod=tata[nod];
            d[nod]=0;
            sol[++nr]=nod;
            dfs1(nod);
        }
}

int main()
{
    freopen("salvare.in", "r", stdin);
    freopen("salvare.out", "w", stdout);
    int k,x,y;
    scanf("%d%d",&n,&k);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    niv[1]=1;
    dfs(1);
    for(int i=1;i<=n;i++) v1[i]=i;
    sort(v1+1,v1+1+n,cmp);
    int st=1,dr=n;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        solve(mid);
        if(nr<=k) dr=mid-1;
        else st=mid+1;
    }
    solve(st);
    for(int i=1;i<=nr;i++) vaz[sol[i]]=1;
    for(int i=1;i<=n && nr<k;i++)
        if(!vaz[i])
        {
            vaz[i]=1;
            nr++;
        }
    printf("%d\n",st);
    for(int i=1;i<=n;i++)
        if(vaz[i]) printf("%d ",i);
    return 0;
}