Pagini recente » Cod sursa (job #618487) | Cod sursa (job #1875098) | Cod sursa (job #97872) | Cod sursa (job #1292897) | Cod sursa (job #169092)
Cod sursa(job #169092)
#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 )
{
v[k] = 1;
if( d == 0 )
return;
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[i] == 0 )
{
k = i;
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();
};