Cod sursa(job #697080)

Utilizator darkseekerBoaca Cosmin darkseeker Data 28 februarie 2012 22:03:48
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <queue>
using namespace std;

#define in "cezar.in"
#define out "cezar.out"
#define maxn 10007

struct graf
{
	short info;
	graf *next;
};

graf *g[maxn];
short nr[maxn];
int s[maxn],K,N,cnt;
bool viz[maxn];
priority_queue<short> h;

inline void push(short x,short y)
{
	graf *q = new graf;
	q->info = y;
	q->next = g[x];
	g[x] = q;
}
void read()
{
	ifstream fin(in);
	fin>>N>>K;
	int i;
	short x,y;
	for(i = 1; i <= N; i++)
		g[i] = NULL;
	for(i = 1; i < N; i++)
	{
		fin>>x>>y;
		push(x,y);
		push(y,x);
	}
}

void df(int nod)
{
	viz[nod] = 1;
	nr[nod] = 1;
	s[nod] = 0;
	for(graf *q = g[nod]; q != NULL; q = q->next)
		if(!viz[q->info])
		{
			df(q->info);
			nr[nod] += nr[q->info];
			s[nod] += s[q->info] + nr[q->info];
		}
	
}

void df1(int nod,int t)
{
	viz[nod] = 1;
	if(t != 0)
		s[nod] = s[t] + N - 2 * nr[nod];
	for(graf *q = g[nod]; q != NULL; q = q->next)
		if(!viz[q->info])
			df1(q->info,nod);
}

void solve()
{
	ofstream fout(out);
	int r,min = 1000000000,i,sol;
	df(1);
	for(i = 1; i <= N; i++)
		viz[i] = 0;
	df1(1,0);
	for(i = 1; i <= N; i++)
		{
			viz[i] = 0;
			if(s[i] < min)
				min = s[i], r = i;
		}
	df(r);
	sol = s[r];
	for(i = 1; i <= N; i++)
		if(i != r)
			h.push(nr[i]);
	while(K--)
	{
		sol -= h.top();
		h.pop();
	}
	fout<<sol<<'\n';	
}

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