我是靠谱客的博主 无私大炮,最近开发中收集的这篇文章主要介绍树形dp,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include <bits/stdc++.h>
using namespace std;
const int maxn=200000;
int f[maxn][2],w[maxn],head[maxn];
int cnt;
bool vis[maxn];
inline int read(){
int num=0,f=1; char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1; c=getchar();
}
while(isdigit(c)){
num=(num+(num<<2)<<1)+(c^48); c=getchar();
}
return num*f;
}
struct node{
int end,next;
}e[maxn];
inline void add_edge(int,int);
void dfs(int);
inline void add_edge(int a,int b){
e[++cnt].end=b;
e[cnt].next=head[a];
head[a]=cnt;
//
cout<<a<<" "<<head[a]<<endl;
//
cout<<e[cnt].next<<" "<<endl;

}
void dfs(int u){
int v;
vis[u]=1;
for(int i=head[u];i!=0;i=e[i].next){
v=e[i].end; //cout<<vis[v]<<" "; cout<<endl<<endl;
if(vis[v]==1) continue;
dfs(v);
f[u][0]+=f[v][1];
f[u][1]+=max(f[v][0],f[v][1]);
}
f[u][0]+=w[u];
//cout<<f[u][0]<<" ";
//cout<<endl<<endl;
return;
}
int main(){
freopen("profitz.in","r",stdin);
freopen("profitz.out","w",stdout);
int n,a,b;
n=read();
for(int i=1;i<=n;i++){
w[i]=read();
}
for(int i=1;i<n;i++){
a=read(); b=read();
add_edge(a,b);
add_edge(b,a);
}
//
for(int i=1;i<=cnt;i++){
//
//
cout<<e[i].next<<" "<<endl;
//
}

dfs(1);
/*
for(int i=1;i<=n;i++){
cout<<f[i][0]<<" "<<f[i][1];
cout<<endl;
}
*/
int ans=max(f[1][1],f[1][0]);
cout<<ans;
return 0;
}
cogs.pro 火车站饭店 

 

转载于:https://www.cnblogs.com/79707536wc/p/7608618.html

最后

以上就是无私大炮为你收集整理的树形dp的全部内容,希望文章能够帮你解决树形dp所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部