Cod sursa(job #502335)

Utilizator skullLepadat Mihai-Alexandru skull Data 18 noiembrie 2010 21:53:07
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 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;
int nrnod[nmax], c[nmax];

struct cmp
{
    bool operator()(const int &a,const int &b) const
    {
        return c[a]>c[b];
    }
};


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], leg[nmax], nr, x, y, i;
	priority_queue<int, vector<int>, cmp> Q;
	nr = k;
	for (i = 1; i <= n; ++i) 
	{ 
		viz[i] = 0; c[i] = inf; nrnod[i] = 0; if (G[i].size() == 1) { Q.push(i); c[i] = m; viz[i] = 1; } leg[i] = G[i].size();
	}
	while ( !Q.empty() )
	{
		x = Q.top(); Q.pop (); nrnod[x]++;
		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); nrnod[y] +=nrnod[x];
				if (leg[y] == 1) 
				{ 
					Q.push(y); viz[y] = 1; 
					if ( c[y] == 0 ) { c[y] = 2*m+1; 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;
}