网页制作与网站建设文档,徐州seo顾问,哈尔滨seo优化排名推广,网页设计实验报告格式最大利润
题目大意#xff1a;
有n个车站#xff0c;每个车站有一定的人数#xff0c;有n-1条线路连接着这些车站#xff0c;相邻的车站不能同时有两个餐厅#xff0c;当在一个车站建立餐厅时#xff0c;会得到这个车站所有人的monny#xff08;1个人可以得到1份利润
有n个车站每个车站有一定的人数有n-1条线路连接着这些车站相邻的车站不能同时有两个餐厅当在一个车站建立餐厅时会得到这个车站所有人的monny1个人可以得到1份利润要使利润最大
样例输入
6
10
20
25
40
30
30
4 5
1 3
3 4
2 3
6 4
样例输出
90
数据范围限制
提示
数据说明
n100000
解题思路
这道题一看就要用到链表我们用链表来存储每一条线然后head是指某一个点连接的第一条线然后用a的next引入其他线然后用f[i][1]来表示第i个车站建餐厅所以相邻的车站只能不建用f[i][0]来表示第i个车站不建所以相邻的车站可以建也可以不建求最大的然后一直推下去最后输出f[1][1]和f[1][0]中最大的就行了
#includecstdio
#includeiostream
#includealgorithm
#includestring
#includecstring
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 ihead[sum];i;ia[i].next)//枚举连接sum的每一条线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 i1;in;i)scanf(%d,s[i]);for (int i1;in;i){scanf(%d %d,x,y);a[w].toy//连接的点;a[w].nexthead[x];//下一条线head[x]w;//代替a[w].tox;//同上a[w].nexthead[y];head[y]w;}js(1);//递归printf(%d,max(f[1][1],f[1][0]));//求最大的return 0;
}