树形DP

1.没有上司的舞会

回访

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 } 

 3.Computer

回访,很好的题

#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;
}

 

posted @ 2020-07-21 20:09  SuYongkang  阅读(96)  评论(0)    收藏  举报