Cod sursa(job #71019)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 8 iulie 2007 21:52:18
Problema Salvare Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

#define maxn 1010
#define pb push_back

int n,k,sol,l;
int c[maxn],rez[maxn],g[maxn],grad[maxn],s[maxn],dist[maxn];
vector <int> a[maxn];

int works(int d)
{
    memcpy(grad,g,sizeof(g));
    memset(dist,0,sizeof(dist));
    
    int i,j,aux,count=0;
    l=0;
    
    for (i=1;i<=n;i++) 
      if (grad[i]==1) 
      {
          s[++l]=i;
          dist[i]=d+1;
      }
      
    for (i=1;i<=l;i++)
    {
      if (dist[s[i]]==2*d+1) 
      {
          dist[s[i]]=0;
          c[++count]=s[i];
      }
      
      for (j=0;j<g[s[i]];j++) 
      {
          aux=a[s[i]][j];
          grad[aux]--;
          if (grad[aux]==1) s[++l]=aux;
          if (dist[s[i]]+1>dist[aux]) dist[aux]=dist[s[i]]+1;
      }
    }
    
    if (dist[s[l]]>d) 
    {
         c[++count]=s[l];
         dist[s[l]]=0;
    }
    
    j=1;
    for (i=count+1;i<=k;i++) 
    {
      for (;j<=n && dist[j]==0;j++);
      dist[j]=0;
      c[i]=j;
    }
    
    return count;
}

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)
    {
          middle=(front+back)/2;
          
          if (works(middle)<=k)
          {
                back=middle-1;
                sol=middle;
                memcpy(rez,c,sizeof(c));
          }
          else front=middle+1;
    }
    
    sort(rez+1,rez+k+1);
    
    printf("%d\n",sol);
    
    for (i=1;i<=k;i++) printf("%d ",rez[i]);
    printf("\n");
    
    return 0;
}