Cod sursa(job #355492)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 11 octombrie 2009 12:24:17
Problema Salvare Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include<stdio.h>
#include<string.h>
#define Nmx 1001

int n,k,fol[Nmx],f;
int grd[Nmx],min[Nmx];
int coada[Nmx],gr[Nmx];
int rt[Nmx];

struct nod
{
    int inf;
    int use;
    nod *urm;
};

nod *G[Nmx];

void add(int x,int y)
{
    nod *aux;
    aux=new nod;
    aux->urm=G[x];
    aux->use=0;
    aux->inf=y;
    G[x]=aux;
}

void citire()
{
    int x,y;
    scanf("%d%d",&n,&k);
    for(int i=1;i<n;++i)
     {
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
        gr[x]++;gr[y]++;
        coada[i]=0;
     }
}

int solve(int M)
{
    int st=1,x,dr=0,nr=0,ok=0,drf=0;
    memset(coada,0,sizeof(coada));
    for(int i=1;i<=n;++i)
     {if(grd[i]==1)
       {
          coada[++dr]=i;
           min[i]=M;
       }
         for(nod *p=G[i];p!=NULL;p=p->urm)
              p->use=0;
     }

    while(st<=dr)
    {
        x=coada[st];
        for(nod *p=G[x];p!=NULL;p=p->urm)
            if(p->use==0)
            {
                p->use=1;
                if(min[x]-1<min[p->inf])
                  min[p->inf]=min[x]-1;
                grd[p->inf]--;
                if(grd[p->inf]==1)
                  {coada[++dr]=p->inf;
                   if(min[p->inf]==0)
                      { min[p->inf]=M+1;
                        nr++;
                        rt[p->inf]=1;
                      }
                  }
            }
        ++st;
    }
    return nr;
}

int main()
{
    freopen("salvare.in","r",stdin);
    freopen("salvare.out","w",stdout);
    citire();
    int x;
    for(int i=1;i<=n;++i)
     {
        for(int i=1;i<=n;++i)
          {
            grd[i]=gr[i];
            min[i]=Nmx+1;
            rt[i]=0;
          }
        x=solve(i);
        if(x<=k)
         {
            printf("%d\n",i);
            for(int j=1;j<=n;j++)
              if(rt[j]==1)
               printf("%d ",j);
            for(int j=x+1;j<=k;++j)
               for(int i=1;i<=n;++i)
                 if(rt[i]==0)
                   {
                       rt[i]=1;
                       printf("%d ",i);
                       break;
                   }

            return 0;
         }
     }
    return 0;
}