Cod sursa(job #71090)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 9 iulie 2007 11:08:02
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#include <vector>
#include <string>

using namespace std;

#define maxn 1010
#define pb push_back

int n,k,d,sum,sol;
vector <int> a[maxn];
int g[maxn],used[maxn],c[maxn],rez[maxn],s[maxn];

void DFS(int nod)
{
     int i,found=0;
     used[nod]=1;
     
     for (i=0;i<g[nod];i++)
       if (!used[a[nod][i]])
       {
             found=1;
             DFS(a[nod][i]);
             if (c[a[nod][i]]+1>c[nod]) c[nod]=c[a[nod][i]]+1;
       }       
       
     if (!found) c[nod]=d+1;
     if (c[nod]==2*d+1) 
     {
        c[nod]=0;
        sum++;
     }
}

int works()
{
    sum=0;
    
    memset(used,0,sizeof(used));
    memset(c,0,sizeof(c));
    
    DFS(1);
    if (c[1]>d) sum++;
    
    return sum;
}

int main()
{
    freopen("salvare.in","r",stdin);
    freopen("salvare.out","w",stdout);
    
    scanf("%d %d ",&n,&k);
    
    int front=0,middle,back=n,i,x,y;
    
    for (i=1;i<n;i++)
    {
        scanf("%d %d ",&x,&y);
        a[x].pb(y);
        a[y].pb(x);        
    }
    
    for (i=1;i<=n;i++) g[i]=a[i].size();
    
    while (front<=back)
    {
          d=(front+back)/2;
          
          if (works()<=k)
          {
               sol=d;
               memcpy(rez,s,sizeof(s));
               back=d-1;
          }
          else front=d+1;
    }
    
    printf("%d\n",sol);
    
    for (i=1;i<=k;i++) printf("%d ",rez[i]);
    printf("\n");
    
    return 0;
}