首页 > 代码库 > HDOJ 题目1520 Anniversary party(树形dp)
HDOJ 题目1520 Anniversary party(树形dp)
Anniversary party
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6271 Accepted Submission(s): 2820
L K
It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line
0 0
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
5
field=problem&key=Ural+State+University+Internal+Contest+October%272000+Students+Session&source=1&searchmode=source">Ural State University Internal Contest October‘2000 Students Session
pid=3001" target="_blank">3001
pid=1074" target="_blank">1074
#include<stdio.h> #include<string.h> #define max(a,b) (a>b?a:b) struct s { int u,v,next; }edge[3000100]; int a[6060],dp[6060][2],dig[6060],head[6060],vis[6060],cnt; void add(int u,int v) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; } void dfs(int u) { vis[u]=1; dp[u][1]=a[u]; int i; for(i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(!vis[v]) { dfs(v); dp[u][0]+=max(dp[v][0],dp[v][1]); dp[u][1]+=dp[v][0]; } } } int main() { int n; while(scanf("%d",&n)!=EOF) { int i; for(i=1;i<=n;i++) { scanf("%d",&a[i]); } int u,v; cnt=0; memset(head,-1,sizeof(head)); memset(dp,0,sizeof(dp)); memset(dig,0,sizeof(dig)); memset(vis,0,sizeof(vis)); while(scanf("%d%d",&v,&u),u||v) { add(u,v); dig[v]++; } int s; for(i=1;i<=n;i++) { if(!dig[i]) { s=i; } } dfs(s); printf("%d\n",max(dp[s][0],dp[s][1])); } }
HDOJ 题目1520 Anniversary party(树形dp)