树的最大权值独立集
来源:互联网 发布:海文网络计划 编辑:程序博客网 时间:2024/06/06 20:57
一棵树,每个点有一个权值,选择一个权值最大的无父子节点点集。
关键词:树的最大”权值“独立集
f[i][0]:以i为根的子树不选根节点最大权值,f[i][1]:以i为根的子树选根节点最大权值
f[u][1]+=f[v][0];
f[u][0]+=max(f[v][1],f[v][0]);
注:1.若所有点的权值都大于0,则树的最大”权值“独立集也是极大点独立集,即任选两个点,一定有且仅有一个在该集合中。若存在点的权值小于0,则不一定成立。
变题:选择一个无祖先与后代节点的最大权值点集
f[u]:以i为根的子树的最大权值
f[u]=max{ w[u],sum{f[v]},v是u的孩子 } 两个选择:当前节点/后代,两个选择互斥
#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<map>#include<vector>#include<queue>#define ll long long#define sf scanf#define pf printf#define maxn 10000#define inf 0x3f3f3f#define INF 1ll<<60#define mem(a,b) memset(a,b,sizeof(a))#define lowbit(x) x&(-x)using namespace std;int n;int a[maxn],du[maxn];struct Edge{ int to,next;}edge[maxn];int head[maxn],tot;int f[maxn][2];//f[u][0]:子树不含u的最大欢乐值 f[u][1]:子树含u的最大欢乐值void add(int a,int b){ edge[tot].to=b,edge[tot].next=head[a],head[a]=tot++;}void dp(int u){ f[u][1]=a[u],f[u][0]=0; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; dp(v); f[u][1]+=f[v][0]; f[u][0]+=max(f[v][1],f[v][0]); }}int main(){ //freopen("a.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); mem(head,-1),mem(du,0),mem(f,0),tot=0; for(int i=1;i<n;i++){ int a,b; scanf("%d%d",&a,&b); add(b,a); du[a]++; } for(int i=1;i<=n;i++) if(!du[i]) {dp(i);printf("%d\n",max(f[i][0],f[i][1]));break;}}
0 0
- 树的最大权值独立集
- 【HDU1520】Anniversary Party-树形DP求树的最大权值独立集
- 【BZOJ1040】骑士(ZJOI2008)-环套树+最大权值独立集
- hdu 1569 最大权独立集
- hdu 1565 最大权独立集
- POJ 2680 —— 最小费用流求解区间图的最大权独立集问题
- hdu 1569 方格取数(2) 最大权独立集
- 【字典序最小最大权独立集】uva12288
- 【BZOJ】1324 Exca王者之剑 最大权独立集
- HDU 1520 Anniversary party 树上最大权独立集
- hdu1565方格取数(1) (最大权独立集)
- hud1569方格取数(2) (最大权独立集)
- 最大权独立集(转最小割) WOJ 648
- poj 3723 kruskal最大权值树
- hdu 1565 方格取数(1)(最小割--最大权独立点集)
- hdu 3657 Game【最大权独立点集------最大流最小割Dinic】
- hdu3061 最大权闭合集
- BZOJ 1324: Exca王者之剑/BZOJ 1475: 方格取数 最大权独立集 最小割
- nginx反向代理
- CentOS6.x中vmware workstation 虚拟机启动报错:Could not open /dev/vmmon
- MAC虚拟内存
- Mac如何允许安装非App Store的软件
- Java SE 8 资料网址备忘
- 树的最大权值独立集
- 一个很有借鉴价值的编程故事
- 并发程序模式(二)—MasterWorker
- 25个JAVA多线程面试题
- Linux 环境使用vim搭建php IDE -- 提高代码编写数度数倍!手把手教你打造程序员的上古神器VIM!
- BNUOJ 44578 Monty Hall problem
- 取消EditText主动获取焦点
- 关于C++读取Lua配置文件实现案例
- 我的VIM配置(C/C++和PHP)