Cod sursa(job #71174)

Utilizator MariusMarius Stroe Marius Data 9 iulie 2007 17:31:15
Problema Salvare Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <stdio.h>
#include <vector>

using namespace std;

const char iname[] = "salvare.in";
const char oname[] = "salvare.out";

#define nlim  1007

#define PB push_back

vector <int> G[nlim];

int Deg[nlim];

int n;

bool s[nlim];


int f(const int k)
{
	int q[nlim], h = 0, t = 0;
	
	int deg[nlim];

	int d[nlim];

	bool u[nlim] = {false};

	for (int i = 1; i <= n; ++ i)
		deg[i] = Deg[i], s[i] = false;

	for (int i = 1; i <= n; ++ i)
		if (deg[i] == 1)	d[q[t ++] = i] = k, u[i] = true;

	for (; h < t; ++ h) {
		int x = q[h];
		int fwd;
		
		if (d[x] == 0)
			fwd = ((k > 0) ? (2 * k + 1) : (0)), s[x] = true;
		else
			fwd = d[x] - 1;

		for (int i = 0; i < (int)(G[x].size()); ++ i) {
			int y = G[x][i];
			if (deg[y] > 1) {
				if (u[y] == false)
					d[y] = fwd, u[y] = true;
				else if (u[y] == true)
					if (d[y] > fwd)
						d[y] = fwd;

				if ((-- deg[y]) == 1)
					q[t ++] = y;
			}
		}
	}

	int cnt = 0;

	for (int i = 1; i <= n; ++ i)
		if (s[i] == true)	cnt ++;

	if (cnt == 0)
		cnt = 1, s[q[t - 1]] = true;

	return cnt;
}

int main(void)
{
	int k;

	FILE *fi = fopen(iname, "r");

	fscanf(fi, "%d", &n);
	fscanf(fi, "%d", &k);

	for (int i = 1; i < n; ++ i) {
		int x, y;
		fscanf(fi, "%d %d", &x, &y);
		G[x].PB(y);
		G[y].PB(x);
		Deg[x] ++, Deg[y] ++;
	}
	
	fclose(fi);

	int delta = 1024, d;

	for (d = 0; delta; delta >>= 1)
		if (f(d + delta) > k)	d += delta;

	if (f(d) > k)	d ++;

	if (d == 0)	for (;;);

	int cnt = f(d);

	for (int i = 1; i <= n; ++ i) {
		if ((cnt < k) && (s[i] == false))
			s[i] = true, cnt ++;
	}

	FILE *fo = fopen(oname, "w");

	fprintf(fo, "%d\n", d);
	
	for (int i = 1; i <= n; ++ i)
		if (s[i] == true)	fprintf(fo, "%d ", i);

	fclose(fo);

	return 0;
}