| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求测试数据啊~~样例和Discuss里的所有数据都过了怎么就A不了啊。。。。求测试数据啊~~样例和Discuss里的所有数据都过了怎么就A不了啊。。。。
#include<vector>
#include<iostream>
#include <stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define MAX 1500
#define INF 0xffffff
int N,p,ans;
int dp[MAX][MAX],ar[MAX],te[MAX],fa[MAX];
char s1[MAX],s2[MAX];
vector<int>son[MAX];
void dfs(int x)
{
//cout<<"dp "<<x<<endl;
if(son[x].size()==0)
{dp[x][0]=1;//代表和父亲断开
dp[x][1]=0;//和父亲相连且有1个节点
}
else
{
for(int i=0;i<son[x].size();i++)
dfs(son[x][i]);
}
if(fa[x]!=-1)
{
dp[fa[x]][1]=son[fa[x]].size();
dp[fa[x]][0]=1;
// cout<<p<<" "<<dp[fa[x]][1]<<" = "<<INF<<endl;
// cout<<"dp fa "<<fa[x]<<endl;
int temp[MAX];
memcpy(temp,dp[fa[x]],sizeof(dp[fa[x]]));
for(int k=1;;k++)
{
// cout<<k<<endl;
if(dp[x][k]==INF)//本节点选K个孤立点的存在可能,不选已算过
break;
else
for(int p=1;;p++)
{
//cout<<p<<" "<<dp[fa[x]][p]<<" = "<<INF<<endl;
if(temp[p]==INF)//父节点不算本节点的可能数
{break;cout<<"break"<<endl;}
else
{
// cout<<"现在节点 "<<x<<" "<<" 父节点数 "<<p<<" 值 "<<" 子节点数 "<<k<<endl;
if(temp[k+p]==INF)//第一次赋值,新取一棵树,不断,-1
{
//cout<<"first dp "<<" 原为 "<<dp[fa[x]][k+p]<<endl;
dp[fa[x]][k+p]=temp[p]+dp[x][k]-1;
// cout<<k+p<<" = "<< dp[fa[x]][k+p]<<endl;
}
else//新取一棵树,不用断-1(刷表)
{
// cout<<"no first"<<endl;
dp[fa[x]][k+p]=min(temp[p]+dp[x][k]-1,temp[k+p]);
// cout<<k+p<<" = "<< dp[fa[x]][k+p]<<endl;
}
}
}
}
}
for(int k=0;;k++)
{if(dp[x][k]==INF)
break;
// cout<<"dp 节点"<<x<<" 孤立数 "<<k<<" "<<dp[x][k]<<endl;
}
}
int main()
{
//freopen("C:\in.txt","r",stdin);
// cin>>p>>t;
// cout<<INF<<endl;
int T,P;
while(cin>>N>>P)
if(N==0)
cout<<"0"<<endl;
else
{
ans=INF;
for(int i=0;i<=N;i++)
son[i].clear();
for(int i=0;i<MAX;i++)
for(int j=0;j<MAX;j++)
dp[i][j]=INF;
memset(fa,-1,sizeof(fa));
for(int i=0;i<N-1;i++)
{
int f,s;
cin>>f>>s;
son[f].push_back(s);
fa[s]=f;
}
dfs(1);
ans=dp[1][P];
for(int i=2;i<=N;i++)
if(dp[i][P]+1<ans)
ans=dp[i][P]+1;
cout<<ans<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator