Cod sursa(job #1039890)

Utilizator misinozzz zzz misino Data 23 noiembrie 2013 18:33:03
Problema Salvare Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<fstream>
#include<algorithm>
#include<vector>
#define  N  1010
using namespace std;
ifstream f("salvare.in");
ofstream g("salvare.out");
int x,y,i,n,k,mij,sol,rez,tt,nr,li,ls,vs[N],niv[N],s[N],ok[N],p[N],t[N];
vector<int>v[N];
inline bool verif1()
{
    for(i=1;i<=n;++i)
    if(ok[i]<=0)
    return 0;
    return 1;
}
inline void update(int x,int k)
{
    if(!k)
    return ;
    ok[x]=k;
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
    if(ok[*it]<k-1)
    update(*it,k-1);
}
inline bool verif(int x)
{
    for(i=1;i<=n;++i)
    ok[i]=0,s[i]=0;
    rez=0;
    for(i=1;i<=n;++i)
    if(!ok[p[i]])
    {
        ++rez;
        nr=x-1;
        tt=t[p[i]];
        while(t[tt]&&nr>0)
        tt=t[tt],--nr;
        s[tt]=1;
        update(tt,x+1);
    }
    if(rez<=k&&verif1())
    return 1;
    return 0;
}
inline void dfs(int x,int tata)
{
    t[x]=tata;
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
    if(*it!=tata)
    {
        niv[*it]=niv[x]-1;
        dfs(*it,x);
    }
}
inline bool cmp(int x,int y)
{
    return niv[x]<niv[y];
}
int main()
{
    f>>n>>k;
    for(i=1;i<n;++i)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1,0);
    for(i=1;i<=n;++i)
    p[i]=i;
    sort(p+1,p+n+1,cmp);
    li=0;
    ls=n;
    while(li<=ls)
    {
        mij=(li+ls)>>1;
        if(verif(mij))
        {
            ls=mij-1;
            sol=mij;
            for(i=1;i<=n;++i)
            vs[i]=s[i];
        }
        else
        {
            li=mij+1;
        }
    }
    g<<sol<<'\n';
    for(i=1;i<=n;++i)
    nr+=vs[i];
    for(i=1;i<=n&&nr<k;++i)
    if(!vs[i])
    ++nr,vs[i]=1;
    for(i=1;i<=n;++i)
    if(vs[i])
    g<<i<<' ';
    g<<'\n';
    return 0;
}