您的位置:首页 > 其它

hdu 1520 树形dp入门

2015-07-15 14:05 281 查看
和poj 1463基本一样。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int N = 6001;
int head
;
int rating
;
bool flag
;
int dp
[2];
int e, n;

void init()
{
e = 0;
memset( flag, true, sizeof(flag) );
memset( head, -1, sizeof(head) );
}

struct Edge
{
int v, next;
} edge
;

void addEdge( int u, int v )
{
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
}

void dfs( int u )
{
dp[u][0] = 0;
dp[u][1] = rating[u];
for ( int i = head[u]; i != -1; i = edge[i].next )
{
int v = edge[i].v;
dfs(v);
dp[u][0] += max( dp[v][0], dp[v][1] );
dp[u][1] += dp[v][0];
}
}

int main ()
{
while ( scanf("%d", &n) != EOF )
{
for ( int i = 1; i <= n; i++ )
{
scanf("%d", rating + i);
}
init();
int v, u;
while ( scanf("%d%d", &v, &u) != EOF )
{
if ( v == 0 && u == 0 ) break;
addEdge( u, v );
flag[v] = false;
}
int root;
for ( int i = 1; i <= n; i++ )
{
if ( flag[i] )
{
root = i;
break;
}
}
dfs(root);
int ans = max( dp[root][0], dp[root][1] );
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: