Cod sursa(job #502259)

Utilizator skullLepadat Mihai-Alexandru skull Data 18 noiembrie 2010 17:42:10
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define pt(i) (1<<(i))
#define inf 2000000000
#define nmax 1005

vector<int> G[nmax];
int n, k;

void citire ()
{
	int i, x, y;
	freopen("salvare.in","r",stdin);
	scanf("%d%d", &n, &k);
	for (i = 1; i < n; ++i)
	{
		scanf("%d%d", &x, &y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
}

int ok(int m)
{
	int viz[nmax], c[nmax], leg[nmax], nr, x, y, i;
	queue<int> Q;
	nr = k;
	for (i = 1; i <= n; ++i) 
	{ 
		viz[i] = 0; c[i] = inf; if (G[i].size() == 1) { Q.push(i); c[i] = m; viz[i] = 1; } leg[i] = G[i].size();
	}
	while ( !Q.empty() )
	{
		x = Q.front(); Q.pop ();
		for (i = 0; i < G[x].size(); ++i)
		{
			y = G[x][i]; leg[y] --;
			if ( !viz[y] ) 
			{
				
				c[y] = min(c[y], c[x] - 1);
				if (leg[y] == 1) 
				{ 
					Q.push(y); viz[y] = 1; 
					if ( c[y] == 0 ) { c[y] = m; nr--; }
				}
			}
		}
	}
	if ( nr < 0 ) return 1;
	return 0;
}

void solve ()
{
	int m = 0, i;
	for (i = 30; i >= 0; --i)
		if (m+pt(i)<=n && ok (m+pt(i)) )
			m +=pt(i);
	freopen("salvare.out","w",stdout);
	printf("%d", m+1);
}

int main ()
{
	citire ();
	solve ();
	return 0;
}