HDU1520 Anniversary party 树形DP基础
Posted ---学习ing---
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1520 Anniversary party 树形DP基础相关的知识,希望对你有一定的参考价值。
InputEmployees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go T lines that describe a supervisor relation tree. Each line of the tree specification has the form:
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 0OutputOutput should contain the maximal sum of guests‘ ratings.
Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
Sample Output
5
水题一道,晚安。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<memory>
using namespace std;
const int maxn=20000;
int vis[maxn],V[maxn],ans,cnt,dp[maxn][2];
int Laxt[maxn],Next[maxn],To[maxn],ru[maxn];
void add(int u,int v){
Next[++cnt]=Laxt[u];
Laxt[u]=cnt;
To[cnt]=v;
}
int dfs(int u)
{
vis[u]=1;
dp[u][1]=V[u];
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(!vis[v]){
dfs(v);
dp[u][1]+=dp[v][0];
dp[u][0]+=max(dp[v][0],dp[v][1]);
}
}
}
int main()
{
int i,j,k,n,u,v;
while(~scanf("%d",&n)){
cnt=0;ans=0;
memset(Laxt,0,sizeof(Laxt));
memset(dp,0,sizeof(dp));
memset(ru,0,sizeof(ru));
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++) scanf("%d",&V[i]);
for(;;){
scanf("%d%d",&u,&v);
if(u==0&&v==0) break;
add(v,u);
ru[u]++;
}
for(i=1;i<=n;i++) {
if(ru[i]==0) {
dfs(i);
ans+=max(dp[i][1],dp[i][0]);//防止多棵树
}
}
printf("%d\n",ans);
}
return 0;
}
以上是关于HDU1520 Anniversary party 树形DP基础的主要内容,如果未能解决你的问题,请参考以下文章
HDU-1520 Anniversary party (树形DP)
HDU1520 Anniversary party 树形DP基础
HDU - 1520 Anniversary party (有向入门树形DP)