Cod sursa(job #2099560)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 4 ianuarie 2018 15:05:24
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 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],fz[nmax],nfz,grad[nmax],pup;
bool viz[nmax];
vector <int> v[nmax];
queue <int> q;
void pusu(int nod,int ant)
{
    int tuc=0;
    for(int i=0;i<v[nod].size();++i)
    {
        if(v[nod][i]!=ant)
        {
            ++tuc;
            pusu(v[nod][i],nod);
        }
    }
    if(!tuc) fz[++nfz]=nod;
}
void dfs(int nod,int dist)
{
    if(dist==m)
    {
        if(grad[nod]>1) act[++rau]=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);
        }
    }
}
inline bool cmp(int t1,int t2)
{
    return grad[t1]<grad[t2];
}
bool verif(int m)
{
    memset(viz,0,sizeof(viz));
    rau=0;
    for(int i=1;i<=nfz;++i) q.push(fz[i]);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        if(viz[nod]) continue;
        ta=0;
        dfs(nod,0);
        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);
        ++grad[a];
        ++grad[b];
    }
    for(int i=1;i<=n;++i)
    {
        if(grad[i]>=2)
        {
            nod=2;
            break;
        }
    }
    if(n<=k)
    {
        g<<0<<'\n';
        for(int i=1;i<=n;++i) g<<i<<' ';
    }
    pusu(nod,0);
    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;
}