CJOJ 2171 火车站开饭店(树型动态规划)

mac2022-06-30  16

CJOJ 2171 火车站开饭店(树型动态规划)

Description

政府邀请了你在火车站开饭店,但不允许同时在两个相连的火车站开。任意两个火车站有且只有一条路径,每个火车站最多有 50 个和它相连接的火车站。 告诉你每个火车站的利润,问你可以获得的最大利润为多少? 例如下图是火车站网络: 最佳投资方案是 1 , 2 , 5 , 6 这 4 个火车站开饭店可以获得的利润为 90.

Input

第一行输入整数 N(<=100000), 表示有 N 个火车站,分别用 1,2,……..,N 来编号。 接下来 N 行,每行一个整数表示每个站点的利润,接下来 N-1 行描述火车站网络,每行两个整数,表示相连接的两个站点。

Output

输出一个整数表示可以获得的最大利润。

Sample Input

6 10 20 25 40 30 30 4 5 4 6 3 4 1 3 2 3

Sample Output

90

Http

CJOJ:http://oj.changjun.com.cn/problem/detail/pid/2171

Source

树型动态规划

解决思路

这道题与POJ2342真是有异曲同工之妙,这里不再过多叙述,请参考这里

代码

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxN=100001; const int inf=2147483647; int n; int Value[maxN]; vector<int> E[maxN]; int F[maxN][5]={0}; bool vis[maxN]={0}; void dfs(int u); int main() { int u,v; cin>>n; for (int i=1;i<=n;i++) scanf("%d",&Value[i]); for (int i=1;i<n;i++) { scanf("%d%d",&u,&v); E[u].push_back(v); E[v].push_back(u); } dfs(1); cout<<max(F[1][1],F[1][0])<<endl; return 0; } void dfs(int u) { vis[u]=1; F[u][1]=Value[u]; F[u][0]=0; for (int i=0;i<E[u].size();i++) { int v=E[u][i]; if (vis[v]==0) { dfs(v); F[u][1]+=F[v][0]; F[u][0]+=max(F[v][1],F[v][0]); } } return; }

转载于:https://www.cnblogs.com/SYCstudio/p/7138199.html

最新回复(0)