1. 程式人生 > >樹形dp模板(C++版)

樹形dp模板(C++版)

poj2342
最簡單的樹形dp入門,樹上的最大點權獨立集

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=6e3+50;
const int M=2e4+50;
struct Edge{
    int v,next;
}edge[M];
int cnt,head[N];
//dp[i][1/0]表示該點取或不取所能獲得的最大權值
int dp[N][2];
int n,u,v;
bool ind[N];
void init
(){ cnt=0; memset(head,-1,sizeof(head)); } void addEdge(int u,int v){ edge[cnt]=Edge{v,head[u]}; head[u]=cnt++; } void dfs(int u){ for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; dfs(v); dp[u][1]+=dp[v][0]; dp[u][0]+=max(dp[v][0],dp[v][1]); }
} int main(void){ while(~scanf("%d",&n)){ init(); memset(ind,false,sizeof(ind)); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ scanf("%d",&dp[i][1]); } while(scanf("%d%d",&v,&u) && (u+v)){ addEdge
(u,v); ind[v]=true; } int root=-1; for(int i=1;i<=n;i++){ if(!ind[i]){ root=i; break; } } dfs(root); printf("%d\n",max(dp[root][0],dp[root][1])); } return 0; }