比赛 |
20120419s |
评测结果 |
AAAWAWWAWA |
题目名称 |
国王的遗产 |
最终得分 |
60 |
用户昵称 |
QhelDIV |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2012-04-19 10:23:17 |
显示代码纯文本
#include <fstream>
#include <memory.h>
using namespace std;
ifstream fin("legacy.in");
ofstream fout("legacy.out");
int n,tn,K,flag[50000],statue[50000],Index,Max,Re;
class Node
{
public:
int Name;
Node *Xt,*Pr;
}Map[50000],*last[50000],*Tar;
void Add(int u,int v)
{
last[u]->Xt=new Node;
last[u]->Xt->Pr=last[u];
last[u]=last[u]->Xt;
last[u]->Name=v;
last[u]->Xt=0;
}
void Initialize()
{
int i,St,En;
fin>>n>>K;
for(i=1;i<=n;i++)
last[i]=&Map[i];
for(i=1;i<n;i++)
{
fin>>St>>En;
Add(St,En);
Add(En,St);
}
}
void DFS(int Pos)
{
Node *p,*tp;
for(p=Map[Pos].Xt;p;p=p->Xt)
if(!flag[p->Name])
{
flag[p->Name]=++Index;
DFS(p->Name);
statue[Pos]+=statue[p->Name];
}
else
tp=p;
statue[Pos]+=1;
int temp=min(statue[Pos],tn-statue[Pos]);
if(temp>Max)
{
Max=temp;
Re=Pos;
Tar=tp;
}
}
void Solve()
{
int i,P;
tn=n;P=1;
for(i=1;i<K;i++)
{
memset(flag,0,sizeof(flag));
memset(statue,0,sizeof(statue));
Index=0;
flag[i]=++Index;Max=-21000000;
DFS(i);
tn-=Max;
fout<<Max<<" ";
Node *p=Map[Tar->Name].Xt;
while(p)
{
if(p->Name==Re)
{
if(p->Pr)
p->Pr->Xt=p->Xt;
if(p->Xt)
p->Xt->Pr=p->Pr;
}
p=p->Xt;
}
if(Tar->Pr)
Tar->Pr->Xt=Tar->Xt;
if(Tar->Xt)
Tar->Xt->Pr=Tar->Pr;
}
fout<<tn<<endl;
}
int main()
{
Initialize();
Solve();
fin.close();
fout.close();
return 0;
}