URAL 1039 Anniversary Party 树形dp
2014-01-12 18:37
302 查看
-----------
-----------
const int maxn=10000; const int maxm=110000; int n; struct EdgeNode{ int to,next; }edges[maxm]; int head[maxn],edge; void init(){ memset(head,-1,sizeof(head)); edge=0; } void addedge(int u,int v){ edges[edge].to=v,edges[edge].next=head[u],head[u]=edge++; } int a[maxn]; int f[maxn][2]; int id[maxn]; int dfs(int u,int flag){ if (f[u][flag]!=-1) return f[u][flag]; int res; if (flag){ res=0; for (int i=head[u];i!=-1;i=edges[i].next){ int v=edges[i].to; res+=dfs(v,0); } } else{ int res1=0,res2=0; for (int i=head[u];i!=-1;i=edges[i].next){ int v=edges[i].to; res1+=dfs(v,1); } for (int i=head[u];i!=-1;i=edges[i].next){ int v=edges[i].to; res2+=dfs(v,0); } res=max(res1+a[u],res2); } return f[u][flag]=res; } int main(){ while (~scanf("%d",&n)){ init(); memset(f,-1,sizeof(f)); memset(id,0,sizeof(id)); for (int i=1;i<=n;i++) scanf("%d",&a[i]); int x,y; while (~scanf("%d%d",&x,&y)){ if (x==0&&y==0) break; addedge(y,x); id[x]++; } int rt=1; for (int i=1;i<=n;i++){ if (id[i]==0) rt=i; } printf("%d\n",dfs(rt,0)); } return 0; }
-----------
相关文章推荐
- URAL 1039 Anniversary Party (树形DP)
- URAL 1039 / poj2342-Anniversary Party-树形DP
- URAL 1039 Anniversary Party 树形dp
- HDU-1520 Anniversary party(树形DP)
- poj 2324 Anniversary party(树形DP)
- poj 2342 Anniversary party 树形dp入门
- Anniversary party HDU - 1520(树形dp)
- HDU 1520 Anniversary party (树形dp,dfs+dp)
- HDU1520 Anniversary party —— 树形DP
- POJ 2342 & HDU 1520 Anniversary party (树形DP)
- poj2342--hdu1520-- Anniversary party(树形DP练习1)
- 树形DP(基础篇)—— Anniversary Party ( HDU 1520 )
- POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party
- POJ 2342 ——Anniversary party(树形dp基础)
- hdu1520 Anniversary party 【树形dp】
- POJ2342 Anniversary party(动态规划)(树形DP)
- 【POJ 2342】Anniversary party(入门树形dp)
- Anniversary party(树形DP)
- HDU 1520 Anniversary party 树形DP
- 【hdu1520-Anniversary party】树形DP