Cod sursa(job #2099499)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 4 ianuarie 2018 14:33:19
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
ifstream f ("salvare.in");
ofstream g ("salvare.out");
const int nmax=1e3+3;
int n,k,a,b,val[nmax],m,pa[nmax],ta,rau,nod,act[nmax],ok,st,dr,usu,sol[nmax];
bool viz[nmax];
vector <int> v[nmax];
queue <int> q;
void pusu(int nod,int ant)
{
    val[nod]=1;
    for(int i=0;i<v[nod].size();++i)
    {
        if(v[nod][i]!=ant)
        {
            pusu(v[nod][i],nod);
            val[nod]+=val[v[nod][i]];
        }
    }
}
inline bool cmp(int t1,int t2)
{
    return val[t1]<val[t2];
}
void dfs(int nod,int dist)
{
    if(dist==m+1)
    {
        pa[++ta]=nod;
        return;
    }
    viz[nod]=1;
    for(int i=0;i<v[nod].size();++i)
    {
        if(!viz[v[nod][i]])
        {
            dfs(v[nod][i],dist+1);
        }
    }
}
bool verif(int m)
{
    memset(viz,0,sizeof(viz));
    rau=0;
    q.push(1);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        if(viz[nod]) continue;
        act[++rau]=nod;
        ta=0;
        dfs(nod,0);
        sort(pa+1,pa+ta+1,cmp);
        for(int i=1;i<=ta;++i) q.push(pa[i]);
    }
    if(rau>k) return 0;
    for(int i=1;i<=n&&rau<k;++i)
    {
        ok=1;
        for(int j=1;j<=rau&&ok;++j)
        {
            if(act[j]==i) ok=0;
        }
        if(ok) act[++rau]=i;
    }
    return 1;
}
int main()
{
    f>>n>>k;
    for(int i=1;i<n;++i)
    {
        f>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    pusu(1,0);
    for(int i=1;i<=n;++i) sort(v[i].begin(),v[i].end(),cmp);
    st=1;
    dr=n;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(verif(m))
        {
            usu=m;
            for(int i=1;i<=k;++i) sol[i]=act[i];
            dr=m-1;
        }
        else st=m+1;
    }
    g<<usu<<'\n';
    sort(sol+1,sol+k+1);
    for(int i=1;i<=k;++i) g<<sol[i]<<' ';
    return 0;
}