码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu P1352 没有上司的舞会

时间:2018-12-04 18:49:32      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:child   inf   break   stream   def   return   思路   string   pac   

题意

  给你一颗树,每个结点有一个值,如果选中一个结点,那么它的子结点不能被选中,求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 没有上司的舞会

标签:child   inf   break   stream   def   return   思路   string   pac   

原文地址:https://www.cnblogs.com/Gsimt/p/10065598.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!