最大利润
题目大意:
有n个车站,每个车站有一定的人数,有n-1条线路连接着这些车站,相邻的车站不能同时有两个餐厅,当在一个车站建立餐厅时,会得到这个车站所有人的monny(1个人可以得到1份利润),要使利润最大
样例输入
6
10
20
25
40
30
30
4 5
1 3
3 4
2 3
6 4
样例输出
90
数据范围限制
提示
数据说明:
n<=100000
解题思路:
这道题一看就要用到链表,我们用链表来存储每一条线,然后head是指某一个点连接的第一条线,然后用a的next引入其他线,然后用f[i][1]来表示第i个车站建餐厅,所以相邻的车站只能不建,用f[i][0]来表示第i个车站不建,所以相邻的车站可以建也可以不建(求最大的),然后一直推下去,最后输出f[1][1]和f[1][0]中最大的就行了
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int p[100005],f[100005][3],s[100005],head[100005],n,x,y,w;
struct rec
{int next,to;
}a[200005];
int js(int sum)
{f[sum][1]=s[sum];p[sum]=1;for (int i=head[sum];i;i=a[i].next)if (!p[a[i].to]){js(a[i].to);f[sum][1]+=f[a[i].to][0];f[sum][0]+=max(f[a[i].to][1],f[a[i].to][0]);}p[sum]=0;
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&s[i]);for (int i=1;i<n;i++){scanf("%d %d",&x,&y);a[++w].to=ya[w].next=head[x];head[x]=w;a[++w].to=x;a[w].next=head[y];head[y]=w;}js(1);printf("%d",max(f[1][1],f[1][0]));return 0;
}