比赛 20120711 评测结果 AAAAAAAAAAAAWAA
题目名称 路由器 最终得分 93
用户昵称 Citron酱 运行时间 0.797 s
代码语言 C++ 内存使用 3.73 MiB
提交时间 2012-07-11 09:58:32
显示代码纯文本
#include <cstdio>

#define I_F "routea.in"
#define O_F "routea.out"

const long MAXn=100000;
const long MAXm=MAXn*2;

struct edge
{
	long x;
	edge *next;
};

edge pool[MAXm];
edge *ph=pool;
edge* map[MAXn]={NULL};
long d[MAXn]={0}, l[MAXn], o[MAXn]={-1};
long h[MAXn+1];
long tail=1;
long n, ans=0;
short k;

template<typename Any>
inline void Swap(Any&, Any&);
void Input();
void Getd(const long&, const long&);
void Geth();
void Delete(const long);
void Dfs(const long&, const long&, const long&);
void Search();
void Output();

int main()
{
	Input();
	Getd(0,1);
	Geth();
	Search();
	Output();
	return 0;
}

template<typename Any>
inline void Swap(Any &a, Any &b)
{
	Any t=a;
	a=b;
	b=t;
}

void Input()
{
	long a, b;
	edge *t;
	freopen(I_F,"r",stdin);
	scanf("%ld%hd",&n,&k);
	for (long i=1; i<n; ++i)
	{
		scanf("%ld%ld",&a,&b);
		--a, --b;
		if (b<a)
			Swap(a,b);
		t=map[a];
		map[a]=ph++;
		map[a]->x=b;
		map[a]->next=t;
		t=map[b];
		map[b]=ph++;
		map[b]->x=a;
		map[b]->next=t;
	}
}

void Getd(const long &x, const long &y)
{
	d[x]=y;
	for (edge *i=map[x]; i!=NULL; i=i->next)
		if (d[i->x]==0)
			o[i->x]=x,
			Getd(i->x,y+1);
}

void Geth()
{
	for (int i=0; i<n; ++i)
	{
		h[tail]=i;
		for (l[i]=tail++; l[i]>1 && d[i]>d[h[l[i]/2]]; Swap(l[i],l[h[l[i]]]))
			Swap(h[l[i]],h[l[i]/2]);
	}
}

void Delete(const long x)
{
	Swap(h[x],h[--tail]);
	Swap(l[h[x]],l[h[tail]]);
	long i=x;
	bool flag=true;
	while (flag)
		if (i*2>=tail)
			flag=false;
		else
			if (i*2+1>=tail)
				if (d[h[i]]<d[h[i*2]])
				{
					Swap(h[i],h[i*2]);
					Swap(l[h[i]],l[h[i*2]]);
					i=i*2;
				}
				else
					flag=false;
			else
				if (d[h[i*2]]>d[h[i*2+1]])
					if (d[h[i]]<d[h[i*2]])
					{
						Swap(h[i],h[i*2]);
						Swap(l[h[i]],l[h[i*2]]);
						i=i*2;
					}
					else
						flag=false;
				else
					if (d[h[i]]<d[h[i*2+1]])
					{
						Swap(h[i],h[i*2+1]);
						Swap(l[h[i]],l[h[i*2+1]]);
						i=i*2+1;
					}
					else
						flag=false;
}

void Dfs(const long &x, const long &y, const long &z)
{
	d[x]=z;
	if (l[x]<tail)
		Delete(l[x]);
	if (y<k)
		for (edge *i=map[x]; i!=NULL; i=i->next)
			if (d[i->x]!=z)
				Dfs(i->x,y+1,z);
}

void Search()
{
	long i;
	while (tail>1)
	{
		++ans;
		i=h[1];
		for (short j=0; j<k && o[i]>0; ++j)
			i=o[i];
		Dfs(i,0,-i);
	}
}

void Output()
{
	freopen(O_F,"w",stdout);
	printf("%ld\n",ans);
}