标签:le 题意 min int 员工 fa 莞中 2022 树型
T1 Anniversary party/没有上司的舞会
【题意】
公司要开party,如果一个员工的上司来了,那么那个员工就不会来。
每个人都有一个开心值,要求到场的员工的开心值之和最大。
【思路】
设 \(f[u,1/0]\) 为员工 \(u\) 来或者不来的最大开心值和。
当员工 \(u\) ,那他的下属 \(u\) 就一定不来
\[f[u,1] = \min \{ f[v,0]\} + happy[u] \]当员工 \(u\) 不来,那他的下属 \(u\) 可来可不来,
\[f[u,0] = \min \{f[v,0], f[v, 1]\} \]点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=6005;
int happy[N];
vector<int> mp[N];
int n;
int fa[N];
int f[N]; // u来
int g[N]; // u不来
void dp(int u)
{
for(int i=0; i<mp[u].size(); i++)
{
int v=mp[u][i];
dp(v);
g[u]+=max(g[v],f[v]);
f[u]+=g[v];
}
f[u]+=happy[u];
}
int main()
{
while(cin>>n)
{
memset(f,0,sizeof f);
memset(g,0,sizeof g);
memset(fa,0,sizeof fa);
for(int i=1; i<=n; i++) cin>>happy[i];
for(int i=0; i<N; i++) mp[i].clear();
for(int i=1; i<=n; i++)
{
int l,k;
cin>>l>>k;
if(l == 0 && k == 0) break;
mp[k].push_back(l);
fa[l]=k;
}
for(int i=1; i<=n; i++)
if(fa[i]==0)
{
dp(i);
cout<<max(g[i],f[i])<<endl;
break;
}
}
return 0;
}
T2 Rebuilding Roads
【题意】
给出一棵含有 n 个节点的有根树,我们现在希望通过删除一些边,让他有一棵有 m 个节点的新树,求删除的最少边的数量。\((1 \le p \le n \le 150)\)
【思路】
定义 \(f[u,k]\) 为 \(n\) 的子树删剩 \(k\) 个点的最小代价。
考虑树上背包,每一个点只能选一次,类似于01背包。
由于是01背包,所以需要枚举 \(j\) 的时候要倒序。
最后答案为 $$ans = \min_{i=1}^{i \le n} f[i,p] + [i != 1]$$。
T3 Cell Phone Network
【题意】
有一些农场构成了一棵树,在一个点建立信号塔后,所有相邻的点都可以收到信号。
现在要求所有的点都有信号,求最小建多少个信号塔。
【思路】
标签:le,题意,min,int,员工,fa,莞中,2022,树型 来源: https://www.cnblogs.com/BorisDimitri/p/16557343.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。