zoukankan      html  css  js  c++  java
  • D. 01Tree 题解(换根dp)

    题目链接

    题目思路

    好久没写换根dp了。。

    \(dp[i][0]\)表示以\(1\)为根节点,以\(i\)为子树出现的\(0000/0000111\)这样的情况

    \(dp[i][1]\)表示以\(1\)为根节点,以\(i\)为子树出现的\(11111\)这样的情况

    然后再换根计算延申到父亲的节点即可

    \(dp\)方程有点复杂,需要仔细思考

    代码

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define debug cout<<"I AM HERE"<<endl;
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
    const double eps=1e-6;
    int n;
    ll ans[maxn];
    int head[maxn],cnt;
    int dp[maxn][2];
    int sum[maxn][2];
    struct edge{
        int to,next,w;
    }e[maxn<<2];
    void add(int u,int v,int w){
        e[++cnt]={v,head[u],w};
        head[u]=cnt;
    }
    void dfs(int u,int fa){
        for(int i=head[u];i;i=e[i].next){
            int to=e[i].to;
            if(to==fa) continue;
            dfs(to,u);
            if(e[i].w==1){           
                dp[u][1]+=1+dp[to][1];
            }else if(e[i].w==0){
                dp[u][0]+=1+dp[to][0]+dp[to][1];
            }
        }
    }
    void solve(int u,int fa){
        ans[u]=sum[u][0]+dp[u][0]+dp[u][1]+sum[u][1];
        for(int i=head[u];i;i=e[i].next){
            int to=e[i].to;
            if(to==fa) continue;
            if(e[i].w==1){
                sum[to][1]=sum[u][1]+1+dp[u][1]-dp[to][1]-1;
            }else if(e[i].w==0){
                sum[to][0]=1+sum[u][0]+sum[u][1]+dp[u][0]-dp[to][0]-dp[to][1]-1+dp[u][1];
            }
            solve(to,u);
        }
    }
    signed main(){
        scanf("%d",&n);
        for(int i=1,u,v,w;i<=n-1;i++){
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        dfs(1,1);
        solve(1,1);
        ll pr=0;
        for(int i=1;i<=n;i++){
            pr+=ans[i];
        }
        printf("%lld\n",pr);
        return 0;
    }
    
    
    
  • 相关阅读:
    决定迁移过来,深耕于此。。。
    一篇搞定MongoDB
    一篇搞定vue请求和跨域
    自定义全局组件
    一篇搞定vue-router
    一篇搞定Vuex
    vue系列
    .Vue.js大全
    一篇搞定spring Jpa操作数据库
    自定义admin
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/15451515.html
Copyright © 2011-2022 走看看