没有上司的舞会
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题目描述 Description
Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。
输入描述 Input Description
第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。
输出描述 Output Description
输出最大的快乐指数。
样例输入 Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
各个测试点1s
——————————————————我是华丽丽的分割线——————————————————————
水题,很坑。
标程用的是数组模拟邻接表,但STL大法好(\(^o^)/~),vector秒杀。。。
存储后从上往下递归,依次计算。
还有一个坑点,在洛谷上数据范围不能信。开6000的数组有4个点会RE,必须开10000的数组才能AC。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<iomanip>
#include<cassert>
#include<climits>
#include<vector>
#define maxn 10001
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,x,y,k;
int cnt,c[maxn],head[maxn];
bool b[maxn];
int f[maxn][];
vector <int> edge[maxn];
void dfs(int i)
{
int a,b;
for(int j=;j<edge[i].size();j++)
{
dfs(edge[i][j]);
f[i][]+=max(f[edge[i][j]][],f[edge[i][j]][]);
f[i][]+=f[edge[i][j]][];
}
f[i][]+=c[i];
}
int main()
{
std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y;
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
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 ;
}
没有上司的舞(污)会(秽)