记录编号 |
103722 |
评测结果 |
AAAAAAAAAAAAAA |
题目名称 |
重建道路 |
最终得分 |
100 |
用户昵称 |
OIdiot |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.008 s |
提交时间 |
2014-05-31 11:29:55 |
内存使用 |
0.50 MiB |
显示代码纯文本
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <cstdio>
#define MAXN 155
#define INF (1<<28)
#define SpeedUp ios::sync_with_stdio(false)
#define FILE
//#define Debug
using namespace std;
int f[MAXN][MAXN];
int TNode[MAXN][MAXN]; //TNode[i][0] Records the Number of child nodes on Node i;
int N,P,root;
bool p[MAXN];
void init()
{
SpeedUp;
#ifdef FILE
freopen("reroads.in","r",stdin);
freopen("reroads.out","w",stdout);
#endif
cin>>N>>P;
memset(p,true,sizeof(p));
for(int i=1;i<N;i++){
int r1,r2;
cin>>r1>>r2;
p[r2]=false;
TNode[r1][0]++;
TNode[r1][TNode[r1][0]]=r2; //Set the new child node;
}
for(int i=1;i<=N;i++){
if(p[i]){
root=i;
break;
}
}
for(int i=1;i<=N;i++)
for(int j=1;j<=P;j++)
f[i][j]=MAXN;
}
void Dp(int o){ //Dp on Node o, as a root;
f[o][1]=0;
for(int i=1;i<=TNode[o][0];i++){
Dp(TNode[o][i]);
for(int j=P;j;j--){
f[o][j]++; //Cut this subtree down if it's not considered.
for(int k=1;k<j;k++){
f[o][j]=min(f[o][j],f[TNode[o][i]][j-k]+f[o][k]);
#ifdef Debug
cout<<"f["<<o<<"]["<<j<<"] = "<<f[o][j]<<endl;
#endif
}
}
}
}
int main()
{
init();
Dp(root);
int Ans=f[root][P];
for(int i=1;i<=N;i++){
Ans=min(Ans,f[i][P]+1);
}
cout<<Ans<<endl;
#ifdef Debug
cout<<"Time Used: "<<(double)clock()/CLOCKS_PER_SEC<<" s."<<endl;
cout<<"Memory Used: "<<(double)(sizeof(p)+sizeof(TNode)+sizeof(f))/(1048576)<<" MB."<<endl;
#endif
return 0;
}