树形DP
回访
2.transaction transaction transaction
1 #include<bits/stdc++.h> 2 using namespace std; 3 inline int read() 4 { 5 int x=0;char c=getchar(); 6 for(;!isdigit(c);c=getchar()); 7 for(;isdigit(c);c=getchar()) x=x*10+c-'0'; 8 return x; 9 } 10 const int N=1e6+10; 11 int tot=0; 12 int nex[N<<1],head[N],to[N<<1],ww[N<<1]; 13 int dp[N][2],val[N]; 14 inline void add(int u,int v,int w) 15 { 16 nex[++tot]=head[u]; 17 head[u]=tot; 18 to[tot]=v; 19 ww[tot]=w; 20 } 21 inline void dfs(int now,int fa) 22 { 23 dp[now][1]=dp[now][0]=val[now]; 24 for(int i=head[now];i;i=nex[i]) 25 { 26 int v=to[i];
27 if(v==fa) continue;
28 dfs(v,now); 29 dp[now][1]=max(dp[now][1],dp[v][1]-ww[i]); 30 dp[now][0]=min(dp[now][0],dp[v][0]+ww[i]); 31 } 32 } 33 int main() 34 { 35 int T=read(); 36 while(T--) 37 { 38 memset(nex,0,sizeof(nex)); 39 memset(head,0,sizeof(head)); 40 tot=0; 41 int n=read(); 42 for(int i=1;i<=n;i++) 43 { 44 val[i]=read(); 45 } 46 for(int i=1;i<n;i++) 47 { 48 int a=read(),b=read(),w=read(); 49 add(a,b,w); 50 add(b,a,w); 51 } 52 dfs(1,-1); 53 int ans=0; 54 for(int i=1;i<=n;i++) 55 { 56 ans=max(ans,dp[i][1]-dp[i][0]); 57 } 58 printf("%d\n",ans); 59 } 60 return 0; 61 }
回访,很好的题
#include<bits/stdc++.h> using namespace std; inline int read() { int x=0;char c=getchar(); for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x; } const int N=10005; int nex[N<<1],head[N],to[N<<1],val[N<<1]; int dp[N][2],n,tot=0; inline void add(int u,int v,int w) { nex[++tot]=head[u]; head[u]=tot; to[tot]=v; val[tot]=w; } inline void dfs1(int now,int fa) { for(int i=head[now];i;i=nex[i]) { int v=to[i]; if(v==fa) continue; dfs1(v,now); dp[now][0]=max(dp[now][0],dp[v][0]+val[i]); } } inline void dfs2(int now,int fa) { int max1=0,v1,max2=0,v2; for(int i=head[now];i;i=nex[i]) { int v=to[i]; if(v==fa) continue; int tmp=dp[v][0]+val[i]; if(tmp>max1) { max2=max1;v2=v1; max1=tmp;v1=v; }else if(tmp==max1||tmp>max2) { max2=tmp;v2=v; } } if(now!=1) { int tmp=dp[now][1]; if(tmp>max1) { max2=max1;v1=-1; max1=tmp; }else if(tmp==max1||tmp>max2) { max2=tmp; } } for(int i=head[now];i;i=nex[i]) { int v=to[i]; if(v==fa) continue; if(v==v1) { dp[v][1]=max2+val[i]; }else { dp[v][1]=max1+val[i]; } dfs2(v,now); } } int main() { while(~scanf("%d",&n)&&n) { memset(nex,0,sizeof(nex)); memset(head,0,sizeof(head)); memset(dp,0,sizeof(dp)); tot=0; for(int i=2;i<=n;i++) { int v=read(),w=read(); add(i,v,w); add(v,i,w); } dfs1(1,0); dfs2(1,0); for(int i=1;i<=n;i++) { printf("%d\n",max(dp[i][0],dp[i][1])); } } return 0; }

浙公网安备 33010602011771号