ACdream1032 Component

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACdream1032 Component相关的知识,希望对你有一定的参考价值。

题解:

树形dp+背包

不难想到,dp[i[j]表示以i为根的子树中,有j个子树的最小和

Size数组记录子树节点个数,然后就树上背包了

树上背包写时,在更新时,需要逆写

这里不懂,问了下q巨,QRZ

技术分享

代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define pb push_back
#define mp make_pair
#define se second
#define fs first
#define ll long long
#define CLR(x) memset(x,0,sizeof x)
#define MC(x,y) memcpy(x,y,sizeof(x))  
#define SZ(x) ((int)(x).size())
#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 
typedef pair<int,int> P;
const double eps=1e-9;
const int maxn=2050;
const int mod=1e9+7;
const ll INF=1e18;
 
ll dp[maxn][maxn],ans[maxn];
int Size[maxn],p[maxn],head[maxn];
int n,cnt;
 
struct Edge{
    int v,nxt;
}edge[maxn*2];
 
void Init(){
    cnt=0;
    memset(Size,0,sizeof(Size));
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++) dp[i][j]=INF;
    for(int i=1;i<=n;i++) ans[i]=INF;
}
 
void AddEdge(int u,int v){
    edge[cnt].v=v;
    edge[cnt].nxt=head[u];
    head[u]=cnt++;
}
 
void dfs(int u,int fa){
    dp[u][1]=p[u]*1LL;
    Size[u]=1;
    for(int i=head[u];i!=-1;i=edge[i].nxt){
        int v=edge[i].v;
        if(v==fa) continue;
        dfs(v,u);
        Size[u]+=Size[v];
        for(int j=Size[u];j>=2;j--)
        for(int k=min(Size[v],j-1);k>=1;k--) dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]);
    }
}
 
int main(){
    int u,v;
    scanf("%d",&n);
    Init();
    for(int i=1;i<=n;i++) scanf("%d",&p[i]);
    for(int i=1;i<=n-1;i++){
        scanf("%d%d",&u,&v);
        AddEdge(u,v);AddEdge(v,u);
    }
    dfs(1,-1);
    for(int i=1;i<=n;i++) 
    for(int j=1;j<=n;j++) ans[j]=min(ans[j],dp[i][j]);
    for(int i=1;i<=n;i++) printf("%lld%c",ans[i],i==n?\\n: );
    return 0;
}

 

以上是关于ACdream1032 Component的主要内容,如果未能解决你的问题,请参考以下文章

ACdream 1101 瑶瑶想要玩滑梯

尝试写入只读数据库(代码 1032)

ACdream 1083 有向无环图dp

ACdream 1023 抑或

ACdream 1025 bfs

ACdream 1139(Sum-逆元)