Cod sursa(job #169297)

Utilizator t3as3r0Laura Cristiana Dragoi t3as3r0 Data 1 aprilie 2008 16:16:22
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.09 kb
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>

using namespace std;

//Tema 1 PA  - Cabane
//Laura Dragoi, 331CC


int **a;
int *t, *bf, *v, *sol;

int n, m, D, Dmin, Dmax;

 
void do_bf()
{
      int i, j, k, last;

      t = new int[n+1];

      memset( t, 0, (n + 1)* sizeof(int) );

      bf = new int[n + 1];
      bf[0] = 1;

	  t[1] =  1;

      k = 0;
      last = 0;

      while( k <= last )
      {
	      
            for( i = 1; i <= a[ bf[k] ][0]; ++i )            
            {	           
                 if( t[ a[ bf[k] ][ i ] ] == 0 )
                  {
                        j = a[ bf[k] ][ i ];
                        bf[++last] = j;
                        t[ j ] = bf[k];
                  };
            }
            ++k;
      };
};

 
void add( int k, int d )
{

	  if (v[k] != 0)
			return ;
			
      if( d == 0 )
            return;

	  v[k] = 1;

      for( int i = 1; i <= a[k][0]; ++i )
      {
            add( a[k][i], d-1 );
      };

};

 

int getMin()
{
      int i, j, k, min = 0;

      memset( v, 0, ( n + 1 )*sizeof(int) );

      sol[0] = 0;

      for( i = n; i > 0; --i ) 
            if( v[bf[i-1]] == 0 )
            {     
                  k = bf[i-1];
                  for( j = 0; j < D; ++j )
                  {
                        k = t[k];
                  };

                  sol[++sol[0]] = k;

                  add( k, D );

                  min++;
            };

      return min;
};

 

void rezolva()
{
      int min, i;

       
      do_bf();


      
      v = new int[n+1];
      sol = new int[n+1];

      Dmin = 0;
      Dmax = n-1;
     
      while( Dmin < Dmax )
      {
            D = ( Dmin + Dmax ) / 2;
            
            min = getMin();

            if( min > m )
            {
                  Dmin = D + 1;
            }
            else
            {
                  Dmax = D ;//- 1;                  
            };
      };

      D = Dmin;

      min = getMin();

      fstream fout ("salvare.out", fstream::out);


      
      // fout << D << " " << min << endl;
      fout << D << endl;

      copy( sol+1, sol+sol[0]+1, ostream_iterator<int>(fout, " ") );

      fout.close();
 
      delete[] v;
      delete[] sol;
      delete[] t;
      delete[] bf;

      for( i = 0; i < n; i++ )
      {
            delete[] a[i];
      };

      delete[] a;
};

 
void read_data()
{
      int i, j, k, l;

      FILE *f = fopen("salvare.in","r"); //cin >> n >> m;
      
      fscanf(f,"%d",&n);
      fscanf(f,"%d",&m);
      
      

      a = new int*[n+1];

      a[0] = NULL;

      for( i = 1; i <= n; ++i )
      {
	      a[i] = new int[n+1];
	      a[i][0] = 0;
      }
      
      
      
      for( i = 1; i < n; ++i )
      {
            fscanf(f,"%d%d", &k, &l); //cin >> k;
            a[k][++a[k][0]] = l;
            a[l][++a[l][0]] = k;            
      };
};

 
int main()
{
      read_data();
      rezolva();
};