Cod sursa(job #551629)

Utilizator katakunaCazacu Alexandru katakuna Data 10 martie 2011 21:55:57
Problema Salvare Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;

#define Nmax 1010
#define INF 0x3f3f3f3f

int n, k, sol;
int viz[Nmax], Gr[Nmax], G[Nmax], s[Nmax], Cst[Nmax], Sol[Nmax];
vector <int> V[Nmax];

void citire () {
	
	int i, x, y;

	scanf ("%d %d", &n, &k);
	for (i = 1; i < n; i++) {
		scanf ("%d %d", &x, &y);
		V[x].push_back (y);
		V[y].push_back (x);
		G[x]++; G[y]++;
	}
}

int cont (int D) {
	
	s[0] = 0;
	memcpy (Gr, G, sizeof (G));
	memset (Cst, INF, sizeof (Cst));
    memset (viz, 0, sizeof (viz));

	int i, p = 1, u = 0, Q[Nmax], nod;
	for (i = 1; i <= n; i++)
		if (Gr[i] == 1) Q[++u] = i, Cst[i] = D, viz[i] = 1;

	while (p <= u) {
		nod = Q[p];
        for (vector <int>::iterator it = V[nod].begin (); it != V[nod].end (); it++)
			if (!viz[*it]) {
				Gr[*it]--;
				Cst[*it] = min (Cst[*it], Cst[nod] - 1);
				if (Gr[*it] == 1) {             
					Q[++u] = *it;
					viz[*it] = 1;

					if (Cst[*it] == 0) {
						s[++s[0]] = *it;
					    if (s[0] > k) return 0;
						Cst[*it] = D;
					} 
				}
			}

		p++;
	}

	return 1;
}

int main () {

	freopen ("salvare.in", "r", stdin);
	freopen ("salvare.out", "w", stdout);
	
	citire ();

    int p = 1, u = n, mij;
    while (p <= u) {
	    mij = (p + u) >> 1;
		if ( cont (mij) ) {
			sol = mij;
			memcpy (Sol, s, sizeof (Sol));
			u = mij - 1;
		}
		else
			p = mij + 1;
	}

	int i;
	memset (viz, 0, sizeof (viz));
	for (i = 1; i <= Sol[0]; i++)
		viz[ Sol[i] ] = 1;

	for (i = 1; Sol[0] < k; i++)
		if (!viz[i]) Sol[++Sol[0]] = i;

	sort (Sol + 1, Sol + k + 1);

	printf ("%d\n", sol);
	for (i = 1; i <= k; i++)
	    printf ("%d ", Sol[i]);

	return 0;
}