Cod sursa(job #71109)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 9 iulie 2007 12:07:29
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <stdio.h>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

#define maxn 1010
#define pb push_back

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

void DFS(int nod)
{
     int i,found=0;
     l++;
     used[nod]=l;
     
     for (i=0;i<g[nod];i++)
       if (used[a[nod][i]]==0)
       {
             found=1;
             DFS(a[nod][i]);
             
             if (c[a[nod][i]]+1>c[nod]) 
             {
                 c2[nod]=c[nod];
                 c[nod]=c[a[nod][i]]+1;
                 p[nod]=a[nod][i];
             }
             else if (c[a[nod][i]]+1>c2[nod]) c2[nod]=c[a[nod][i]]+1;
             
             v[nod]|=v[a[nod][i]];
       }     
       
      for (i=0;i<g[nod];i++)
        if ((used[a[nod][i]]>used[nod]) && (v[a[nod][i]]))
        {
            if ((a[nod][i]!=p[nod]))
            {
                 if ((c[nod]>c[a[nod][i]]+1) && (c[nod]+c[a[nod][i]]<=2*d)) c[nod]=c[a[nod][i]]+1;
            }
            else if ((c[nod]>c[a[nod][i]]+1) && (c2[nod]+c[a[nod][i]]<=2*d)) c[nod]=c[a[nod][i]]+1;
        }
       
      if (!found) c[nod]=d+1;
      
      if (c[nod]==2*d+1) 
      {
          c[nod]=0;  
          v[nod]=1;
          s[++sum]=nod;
      }
      
      l--; 
}

int works()
{
    sum=0;
    
    memset(used,0,sizeof(used));
    memset(v,0,sizeof(v));
    memset(c,0,sizeof(c));
    memset(c2,0,sizeof(c2));
    
    int i,j;
    
    DFS(1);
    if (c[1]>d) 
    {
        s[++sum]=1;
        c[1]=0;
    }
    
    j=1;
    for (i=sum+1;i<=k;i++) 
    {
      for (;c[j]==0;j++);
      s[i]=j;
      c[j]=0;
    }
    
    
/*    printf("%d\n",sum);
    
    printf("%d: ",d);
    
    for (int i=1;i<=n;i++) printf("%d ",c[i]);
    printf("\n");*/
    
    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;
    }
    
    sort(rez+1,rez+k+1);
    
    printf("%d\n",sol);
    
    for (i=1;i<=k;i++) printf("%d ",rez[i]);
    printf("\n");
    
    return 0;
}