参考:
点击打开链接
需要特别注意的是这种题目一定要递归找到根节点再从根节点进行dfs,上面的链接中的代码就是因为没有进行这一步所以TLE
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=6000+50;
int dp[maxn][2],root,father[maxn],vis[maxn];///二维数组不要两边都开这么大很容易MLE
int employee,l,k;
void dfs(int node)
{
vis[node]=1;
for(int i=1;i<=employee;i++)
{
if(!vis[i]&&father[i]==node)
{
dfs(i);
dp[node][0]=dp[node][0]+max(dp[i][1],dp[i][0]);
dp[node][1]=dp[node][1]+dp[i][0];
}
}
}
int main()
{
while(scanf("%d",&employee)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
memset(father,0,sizeof(father));
for(int i=1;i<=employee;i++)
scanf("%d",&dp[i][1]);
while(scanf("%d%d",&l,&k))
{
if(l==0&&k==0) break;
father[l]=k;
}
root=k;
while(father[root])
root=father[root];
dfs(root);
printf("%d\n",max(dp[root][0],dp[root][1]));
}
return 0;
}