zoukankan      html  css  js  c++  java
  • P1352 没有上司的舞会

    Ural大学有N名职员,编号为1~N。

    他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。

    每个职员有一个快乐指数,用整数 Hi
    给出,其中 1≤i≤N
    现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。

    在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。

    输入格式
    第一行一个整数N。接下来N行,第 i 行表示 i 号职员的快乐指数 Hi
    接下来N-1行,每行输入一对整数L, K,表示K是L的直接上司。

    输出格式
    输出最大的快乐指数。

    数据范围
    1≤N≤6000,
    −128≤Hi≤127

    思路:用两个状态表示以 u 为根节点的状态,1表示选中根节点,0表示不选根节点
    状态表示:f[i][0] 表示以 i 为根节点且不选的状态,f[i][1]表示选中i号点的情况
    状态计算:枚举 i 的子节点 k , 则f[i][0] += max(f[k][0], f[k][1]) , 由于选中了父节点,那么就不能选中子节点 ,所以 f[i][1] += f[k][0]

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 6010;
    
    int n;
    int h[N],e[N],ne[N],idx;
    int happy[N], f[N][2];
    bool st[N];
    
    void add(int a,int b)
    {
        e[idx] = b,ne[idx] = h[a],h[a] = idx++;
    }
    
    void dfs(int u)
    {
        f[u][1] = happy[u];
        
        for(int i = h[u];i != -1;i = ne[i])
        {
            int j = e[i];
            dfs(j);
            f[u][0] += max(f[j][1], f[j][0]);
            f[u][1] += f[j][0];
        }
    }
    
    int main()
    {
        cin >> n;
        for(int i = 1;i <= n;i++) cin >> happy[i];
        
        memset(h,-1,sizeof h);       //初始化邻接表
        for(int i = 1;i < n;i++)
        {
            int a,b;
            cin >> a >> b;
            st[a] = true;
            add(b,a);
        }
        
        int t = 1;
        while(st[t]) t++;   //找到根节点
        
        dfs(t);
        
        cout << max(f[t][0], f[t][1]) << endl;
        return 0;
    }
    
  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/zcxy/p/12931219.html
Copyright © 2011-2022 走看看