
P1352 没有上司的舞会
题目描述
某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。
输入输出格式
输入格式:
第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0 0
输出格式:
输出最大的快乐指数。
输入输出样例
输入样例#1:
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
输出样例#1:
5
——————————————————————————————————我是华丽丽的分割线———————————————————————————————— 树形动规果题。
/*
Problem:P1352 没有上司的舞会
OJ: 洛谷
User: S.B.S.
Time: 27 ms
Memory: 16992 kb
Length: N/A
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<iomanip>
#include<cassert>
#include<climits>
#include<functional>
#include<bitset>
#include<vector>
#include<list>
#include<map>
#define F(i,j,k) for(int i=j;i<=k;i++)
#define M(a,b) memset(a,b,sizeof(a))
#define FF(i,j,k) for(int i=j;i>=k;i--)
#define maxn 10001
#define inf 0x3f3f3f3f
#define maxm 1001
#define mod 998244353
//#define LOCAL
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m;
int x,y,k;
int cnt,c[maxn],head[maxn];
bool b[maxn];
int f[maxn][];
vector <int> edge[maxn];
void dfs(int u)
{
int a,b;
for(int i=;i<edge[u].size();i++)
{
dfs(edge[u][i]);
f[u][]+=max(f[edge[u][i]][],f[edge[u][i]][]);
f[u][]+=f[edge[u][i]][];
}
f[u][]+=c[u];
}
int main()
{
std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y;
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
int n,m;
cin>>n;
for(int i=;i<=n;i++) cin>>c[i];
int x,y;
for(int i=;i<=n;i++)
{
cin>>x>>y;
if(x==&&y==) break;
else
{
edge[y].push_back(x);
b[x]=true;
}
}
for(int i=;i<=n;i++)
{
if(b[i]==false)
{
dfs(i);
cout<<max(f[i][],f[i][])<<endl;
break;
}
}
return ;
}
p1352