没有上司的舞会 题解
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128< =Ri< =127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
#include<iostream>
using namespace std;
const int N=6060;
int f[N][3],a[6001],b[6001]={0}; //f数组负责存储职员的快乐最大值,而a数组负责存储每位员工的快乐值,b数组利用存储每个节点的父亲节点从而找出树根并将其值赋入root变量。也可逆用找出父节点的子节点。
int n;
void dfs(int root)
{
int c[6001]={0};//c数组存储父节点的子节点
int i,t=0;
for(i=1;i<=n;i++)
{
if(b[i]==root)
{
t++;
c[t]=i;
}//利用t来控制c数组的存储空间,并将遍历出的此父节点的子节点t存入c数组
}
if(t==0)//t也可用于判断此节点是否为叶子结点,如果是,则返回上一次递归
{
f[root][1]=a[root];
f[root][0]=0;
return ;//返回上一次递归
}
f[root][1]=a[root];
for(i=1;i<=t;i++)//遍历此父节点的子节点
dfs(c[i]);//递归搜索此父节点的子节点并执行操作
f[root][0]+=max(f[c[i]][0],f[c[i]][1]);//将最大快乐值存入
f[root][1]+=f[c[i]][0];
}
}//dfs搜索函数,递归搜索所有节点
int main()
{
int t,t1,root;
int i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
}//输入员工快乐值
for(i=1;i<=n;i++)
{
cin>>t>>t1;
b[t]=t1;
}//在b数组中录入树的信息将并将以子节点的单元录入其父节点的数值
for(i=1;i<=n;i++)
{
if(b[i]==0)//如果一个节点的值没有被更改为其父节点的信息而仍保持初始值0,代表其没有父节点,即此节点为根节点
{
root=i;//将遍历到的根节点i,存入root变量
dfs(root);//递归搜索子节点从根节点开始
}
}
cout<<max(f[root][0],f[root][1])<<endl;//输出f[root][0]与f[root][1]之间的最大值输出,即职员的最大快乐值,即正解
return 0;//完美结束
}