标签:
//meek///#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <queue> #include <map> #include <set> #include <stack> #include <sstream> #include <vector> using namespace std ; #define mem(a) memset(a,0,sizeof(a)) #define pb push_back #define fi first #define se second #define MP make_pair typedef long long ll; const int N = 151000; const int inf = 99999999; const int mod= 1000000007; int dp[N],root,n,k,a[N];//k vector<int >G[N]; void dfs(int x,int *dp) { int last[N]; for(int i=0;i<=k;i++) last[i]=dp[i]; for(int i=0;i<G[x].size();i++) { int v=G[x][i]; dfs(v,last); } for(int i=k;i>=1;i--) { if(dp[i-1]||!(i-1)) { dp[i]=max(last[i],dp[i-1]+a[x]); } else dp[i]=last[i]; } } int main() { int u; while(scanf("%d%d",&n,&k)!=EOF) { for(int i=0;i<=n;i++) G[i].clear(); for(int i=1;i<=n;i++) { scanf("%d%d",&u,&a[i]); if(u==0) root=i; else G[u].pb(i); } for(int i=0;i<=k;i++) dp[i]=0; dfs(root,dp); if(dp[k]) { cout<<dp[k]<<endl; } else printf("impossible\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zxhl/p/5061355.html