Luogu P1352 没有上司的舞会

Posted gsimt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1352 没有上司的舞会相关的知识,希望对你有一定的参考价值。

题意

  给你一颗树,每个结点有一个值,如果选中一个结点,那么它的子结点不能被选中,求max(选中结点的值的和)

思路

 v[i][0]:=以i为根的树,不选i的max;v[i][0]:=以i为根的树,选i的max

 如果i不选,它的孩子可以选,可以不选,所以取大的那个;选i,它的孩子只能不选

 v[root][0]+=max(v[child[root][i]][1],v[child[root][i]][0])

 v[root][1]+=v[child[root][i]][0];

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<map>
#define INF 0x7f7f7f7f
#define MAX_INT 0x7fffffff
#define pi 3.1415926
typedef unsigned int uint;
using namespace std;
typedef long long LL;
vector<int>child[6001];
bool vis[6001]; 
int kl[6001][2];//1参加,0不参加 
void dfs(int root){    
    for(int i=0;i<child[root].size();i++){
        dfs(child[root][i]);
    }
    for(int i=0;i<child[root].size();i++){
        kl[root][0]+=max(kl[child[root][i]][1],kl[child[root][i]][0]);
        kl[root][1]+=kl[child[root][i]][0];
    }
    return ;
}
int main(){
    memset(kl,0,sizeof(kl));
    memset(vis,0,sizeof(vis));
    int n,a,b;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>kl[i][1];
    }
    for(int i=1;i<n;i++){
        cin>>a>>b;
        child[b].push_back(a);
        vis[a]=1;
    }
    int root;
    for(int i=1;i<=n;i++)
    if(!vis[i]){
        root=i;
        break;
    }
    dfs(root);
    cout<<max(kl[root][0],kl[root][1]);
    return 0;
}

 

以上是关于Luogu P1352 没有上司的舞会的主要内容,如果未能解决你的问题,请参考以下文章

Luogu P1352 没有上司的舞会

[luogu]P1352 没有上司的舞会[树形DP]

Luogu P1352 没有上司的舞会

luogu P1352ybtoj 树形DP课堂过关 例题1树上求和 & 没有上司的舞会

洛谷——P1352 没有上司的舞会

P1352 没有上司的舞会