SGU 143 Long Live the Queen
2018-03-27 12:59
465 查看
求一棵树上的联通子图使得其所有节点权值和最大
树形dp
dp[u]表示这个结点为根的最大权联通子图
转移为dp[u] = val[u] + sum( max(0,dp[v]) )
假如选儿子节点的贡献为负则不选
树形dp
dp[u]表示这个结点为根的最大权联通子图
转移为dp[u] = val[u] + sum( max(0,dp[v]) )
假如选儿子节点的贡献为负则不选
#include <iostream> #include <algorithm> #include <sstream> #include <string> #include <queue> #include <cstdio> #include <map> #include <set> #include <utility> #include <stack> #include <cstring> #include <cmath> #include <vector> #include <ctime> #include <bitset> using namespace std; #define pb push_back #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d%d",&n,&m) #define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k) #define sld(n) scanf("%lld",&n) #define sldd(n,m) scanf("%lld%lld",&n,&m) #define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k) #define sf(n) scanf("%lf",&n) #define sff(n,m) scanf("%lf%lf",&n,&m) #define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k) #define ss(str) scanf("%s",str) #define ansn() printf("%d\n",ans) #define lansn() printf("%lld\n",ans) #define r0(i,n) for(int i=0;i<(n);++i) #define r1(i,e) for(int i=1;i 4000 <=e;++i) #define rn(i,e) for(int i=e;i>=1;--i) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define lowbit(a) (a&(-a)) #define all(a) a.begin(),a.end() #define pii pair<int,int> #define pll pair<long long,long long> #define mp(aa,bb) make_pair(aa,bb) #define lrt rt<<1 #define rrt rt<<1|1 #define X first #define Y second #define PI (acos(-1.0)) typedef long long ll; typedef unsigned long long ull; typedef long double ld; //const ll mod = 1000000007 ; const double eps=1e-9; const int inf=0x3f3f3f3f; //const ll infl = 100000000000000000;//1e17 const int maxn= 1e5+20; const int maxm = 1e5+20; //muv[i]=(p-(p/i))*muv[p%i]%p; int in(int &ret) { char c; int sgn ; if(c=getchar(),c==EOF)return -1; while(c!='-'&&(c<'0'||c>'9'))c=getchar(); sgn = (c=='-')?-1:1; ret = (c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9')ret = ret*10+(c-'0'); ret *=sgn; return 1; } int a[maxn]; vector<int>g[maxn]; int ans = -inf; int dfs(int u,int f) { int sz = g[u].size(); int tot = a[u]; for(int i=0;i<sz;++i) { int v = g[u][i]; if(v==f)continue; tot += max(0,dfs(v,u)); } ans = max(ans,tot); return tot; } int main() { #ifdef LOCAL freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // LOCAL int n; sd(n); r1(i,n)sd(a[i]); r1(i,n-1) { int u,v; sdd(u,v); g[u].pb(v); g[v].pb(u); } dfs(1,0); ansn(); return 0; }
相关文章推荐
- SGU143 Long Live the Queen
- sgu143 树形DP Long Live the Queen
- B - Long Live the Queen SGU - 143
- SGU 143 Long Live the Queen(树形DP)
- sgu143:Long Live the Queen
- sgu 143 Long live the Queen 简单树形dp
- SGU 143 Long Live the Queen (树形DP)
- SGU 143.Long Live the Queen(女王万岁)
- SGU 143.Long Live the Queen(女王万岁)
- SGU - 143 Long Live the Queen 树形dp之加和问题
- SGU 143. Long Live the Queen(树形DP)
- SGU143 Long Live the Queen
- 143. Long Live the Queen 树形dp 难度:0
- SGU P143 Long Live the Queen【树形DP】
- 【树形dp】Long Live the Queen
- 143 Long Live Queen(树形dp)
- Pass-the-Hash is Dead: Long Live Pass-the-Hash
- The Love of a King——6、The King is Dead!Long Live the King
- UVALive - 5097 Cross the Wall(斜率优化)
- UVALive 4370 A Day at the Races