先上题目:
Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 3859 Accepted
Submission(s): 1798
1 #include <cstdio> 2 #include <cstring> 3 #define max(x,y) (x > y ? x : y) 4 #define MAX 6003 5 6 using namespace std; 7 8 int v[MAX]; 9 int p[MAX],tot; 10 int c[MAX],to[MAX]; 11 int dp[2][MAX]; 12 bool f[MAX]; 13 14 15 void dfs(int r){ 16 for(int i=p[r];i!=-1;i=to[i]){ 17 dfs(c[i]); 18 dp[1][r]+=dp[0][c[i]]; 19 dp[0][r]+=max(dp[0][c[i]],dp[1][c[i]]); 20 } 21 } 22 23 void add(int l,int k){ 24 c[tot]=l; 25 to[tot]=p[k]; 26 p[k]=tot++; 27 } 28 29 int main() 30 { 31 int n,l,k,maxn,r; 32 //freopen("data.txt","r",stdin); 33 while(scanf("%d",&n)!=EOF){ 34 memset(dp,0,sizeof(dp)); 35 for(int i=1;i<=n;i++){ 36 scanf("%d",&v[i]); 37 dp[1][i]=v[i]; 38 } 39 tot=0; 40 memset(p,-1,sizeof(p)); 41 memset(c,0,sizeof(c)); 42 memset(to,0,sizeof(to)); 43 memset(f,0,sizeof(f)); 44 while(scanf("%d %d",&l,&k),(k+l)){ 45 add(l,k); 46 f[l]=1; 47 } 48 for(int i=1;i<=n;i++){ 49 if(!f[i]){ 50 r=i; 51 break; 52 } 53 } 54 dfs(r); 55 maxn=max(dp[0][r],dp[1][r]); 56 printf("%d\n",maxn); 57 } 58 return 0; 59 }
HDU - 1520 - Anniversary party
原文:http://www.cnblogs.com/sineatos/p/3555894.html