Pagini recente » Cod sursa (job #1741219) | Cod sursa (job #767811) | Cod sursa (job #53575) | Cod sursa (job #56603) | Cod sursa (job #55402)
Cod sursa(job #55402)
Utilizator |
Mircea Pasoi domino |
Data |
27 aprilie 2007 13:09:26 |
Problema |
Salvare |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
2.14 kb |
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
using namespace std;
const int maxN = 1001;
vector<int> niv[ maxN ];
vector<int> fii[ maxN ];
vector<int> sol;
int tata[ maxN ];
int mark[ maxN ];
int n,k;
int nvm;
int nvmc;
void DFS( int nodc, int nvmm, int nvcc )
{
int i;
if ( nvcc > nvmm ) return;
mark[ nodc ] = 1;
for ( i = 0 ; i < fii[ nodc ].size(); i++ )
if ( !mark[ fii[ nodc ][ i ] ] )
DFS( fii[ nodc ][ i ], nvmm, nvcc+1 );
}
int mere_treaba( int distm )
{
int x = 0;
int i,j=0;
int dist = 0;
nvmc = nvm;
memset( mark, 0 ,sizeof( mark ) );
while ( nvm && j <= k )
{
x = 0;
while ( x == 0 && nvm )
{
for ( i = 0; i < niv[ nvm ].size(); i++ )
if ( !mark[ niv[ nvm ][ i ] ] ) { x+=1; break; }
if ( !x ) nvm--;
}
if ( nvm == 0 ) break;
else
{
x = niv[ nvm ][ i ];
dist = 0;
while ( dist < distm && tata[ x ] )
{
x = tata[ x ];
dist++;
}
DFS( x, distm, 0 );
sol.push_back( x );
}
j++;
}
if ( ( nvm == 0 ) && ( j <= k ) ) return 1;
nvm = nvmc;
return 0;
}
void clasifica( int nodc, int nv, int tati )
{
int i;
if ( nv > nvm ) nvm = nv;
tata[ nodc ] = tati;
mark[ nodc ] = 1;
niv[ nv ].push_back( nodc );
for ( i = 0; i < fii[ nodc ].size(); i++ )
if ( !mark[ fii[ nodc ][ i ] ] )
clasifica( fii[ nodc ][ i ], nv+1, nodc );
}
int main()
{
int i,x = 0;
int step;
int a,b;
srand( time(0) );
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
scanf("%d\n%d\n", &n, &k );
for ( i = 1; i < n; i++ )
{
scanf("%d %d\n", &a, &b );
fii[ a ].push_back( b );
fii[ b ].push_back( a );
}
clasifica( 1, 1, 0 );
for ( step = 1; step < n; step <<=1 );
for ( i = 0; step; step >>= 1 )
if ( i + step < n )
if ( !mere_treaba( i + step ) ) i += step;
mere_treaba( i + 1 );
printf("%d\n", i+1 );
memset( mark, 0, sizeof ( mark ) );
for ( i = 0; i < sol.size(); i++ )
{
printf("%d ", sol[ i ] );
mark[ sol[i] ] = 1;
}
for ( i = sol.size(); i < k; i++ )
{
while ( !x || mark[x] )
x = rand()%(n+1);
printf("%d ", x );
}
fclose(stdin);
fclose(stdout);
return 0;
}