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 没有上司的舞会的主要内容,如果未能解决你的问题,请参考以下文章