Cod sursa(job #166992)

Utilizator sealTudose Vlad seal Data 28 martie 2008 20:12:39
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
using namespace std;
#include<cstdio>
#include<vector>
#define Nm 1024
#define min(a,b) ((a)<(b)?(a):(b))
char Viz[Nm];
int D[Nm],Deg[Nm],A[Nm],B[Nm],Q[Nm],n,k;
vector<int> G[Nm];

void read()
{
    int i,x,y;

    freopen("salvare.in","r",stdin);
    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);
        ++D[x]; ++D[y];
    }
}

int findmin(int m)
{
    int l=0,r=-1,i,x,ans=0;
    vector<int>::iterator it;

    for(i=1;i<=n;++i)
    {
        Viz[i]=0; A[i]=m; B[i]=n; Deg[i]=D[i];
        if(D[i]<2)
            Q[++r]=i;
    }

    while(l<=r)
    {
        x=Q[l++];
        if(A[x]<B[x] && (!A[x] || !Deg[x]))
            B[x]=0, ++ans;
        for(it=G[x].begin();it!=G[x].end();++it)
            if(!Viz[*it])
            {
                if(A[x]<B[x])
                    A[*it]=min(A[*it],A[x]-1);
                else
                    B[*it]=min(B[*it],B[x]+1);
                --Deg[*it];
                if(Deg[*it]==1)
                    Q[++r]=*it;
            }
        Viz[x]=1;
    }
    return ans;
}

int solve()
{
    int i=0,j=n-1,m;

    while(i<j)
    {
        m=i+j>>1;
        if(findmin(m)<=k)
            j=m;
        else
            i=m+1;
    }

    findmin(j);
    for(m=0,i=1;i<=n;++i)
        if(!B[i]) ++m;
    for(i=m,m=0;i<k;++i)
        A[++m]=1;
    for(i=1;i<=n;++i)
        if(!B[i]) A[++m]=i;
    return j;
}

void write(int ans)
{
    int i;
    
    freopen("salvare.out","w",stdout);
    printf("%d\n",ans);
    for(i=1;i<k;++i)
        printf("%d ",A[i]);
    printf("%d\n",A[i]);
}

int main()
{
    read();
    write(solve());
    return 0;
}