比赛 |
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);
}