您的位置:首页 > 其它

hdu 1520 树形dp入门

2013-07-07 18:43 411 查看
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 6000+50;
int dp[maxn][2];
bool vis[maxn];
struct node
{
int fa;
vector<int> ch;
};
node p[maxn];
void dfs(int cur)
{
vis[cur]=1;
int s=p[cur].ch.size();
for(int i=0;i<s;i++)
{
int ch=p[cur].ch[i];
if(!vis[ch])
{
dfs(ch);
dp[cur][1]+=dp[ch][0];
dp[cur][0]+=max(dp[ch][1],dp[ch][0]);
}
}
}
int main()
{
int n,a,b,root;
while(~scanf("%d",&n))
{
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
scanf("%d",&dp[i][1]);
dp[i][0]=0;
}
while(~scanf("%d%d",&a,&b)&&(a||b))
{
p[a].fa=b;
p[b].ch.push_back(a);
}
root=1;
for(int i=1;i<=n;i++)
{
if(!p[i].fa)
{
root=i;
break;
}
}
dfs(root);
printf("%d\n",max(dp[root][0],dp[root][1]));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: