只有十分捏,各位大佬帮帮忙吧
查看原帖
只有十分捏,各位大佬帮帮忙吧
945630
jjj0523楼主2023/3/2 19:05
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n;//职员人数
int r[100];//存储快乐指数
bool cha[100];//用于查根的数组
int root;//保存根节点
int dp[100][2];//状态转移数组其中二维中1代表参加舞会,0代表不参加舞会
vector<int> tree[100];//邻接矩阵
void DFS(int u)
{
    //u是某个子树的根,先置此子树的初值
    dp[u][0]=0;
    dp[u][1]=r[u];
    //往下递归u的每颗子树的情况遍历tr[u]的所有子树情况
    for(vector<int>::iterator it =tree[u].begin(); it != tree[u].end(); it++)//遍历以u为根的向量中所有子树
    {
        DFS((*it));//递归遍历子树如果有子树则一直走走向根
        //递归结束时结果自底向上返回
        dp[u][0]=dp[u][0]+max(dp[(*it)][1],dp[(*it)][0]);//根节点不选择时候
        dp[u][1]=dp[u][1]+dp[(*it)][0];//选了上司就不可以选下属
    }

}
int main()
{
    scanf("%d",&n);//职员人数
    for(int i=1;i<=6000;i++)
    {
        scanf("%d",&r[i]);
    }
    for(int i=1 ,a,b;i<=6000;i++)
    {
        //输入a和b,代表a是b的直接上司
        scanf("%d",&a);
        scanf("%d",&b);
        cha[b] = true;//b不是根
        tree[a].push_back(b);//把下属b放在上司a的向量中
    }
    //查那个是跟
    for(int i=1;i<=6000;i++)
    {
        if(cha[i] == false)
        {
            root=i;
            break;
        }
    }
    DFS(root);
    //输出根参加舞会和不参加舞会两种情况下最大值就是此时的
    printf("%d",max(dp[root][0],dp[root][1]));
}
2023/3/2 19:05
加载中...