zoukankan      html  css  js  c++  java
  • [树形DP]Luogu P1131 [ZJOI2007]时态同步

    https://www.luogu.org/problemnew/show/P1131

    分析

    我们设t[i]为以i为根的子树中需要最久达到的点所需的时间

    那么我们容易用一次DFS预处理出来,再DFS记录深入到当前点已经加过k次,ans=Σ(t[rt]-t[u]-k),k=t[rt]-t[u]

    #include <iostream>
    #include <cstdio>
    using namespace std;
    const int N=5e5+10;
    struct Graph {
        int v,nx,w;
    }g[2*N];
    int cnt,list[N];
    int n,rt;
    int tme[N],mx;
    long long ans;
    
    void Add(int u,int v,int w) {
        g[++cnt]=(Graph){v,list[u],w};list[u]=cnt;
        g[++cnt]=(Graph){u,list[v],w};list[v]=cnt;
    }
    
    void DFS(int u,int fa) {
        for (int i=list[u];i;i=g[i].nx)
            if (g[i].v!=fa) {
                tme[g[i].v]=tme[u]+g[i].w;
                DFS(g[i].v,u);
            }
        for (int i=list[u];i;i=g[i].nx)
            if (g[i].v!=fa) tme[u]=max(tme[u],tme[g[i].v]);
    }
    
    void DFS(int u,int fa,int t) {
        for (int i=list[u];i;i=g[i].nx)
            if (g[i].v!=fa) {
                ans+=mx-tme[g[i].v]-t;
                DFS(g[i].v,u,mx-tme[g[i].v]);
            }
    }
    
    int main() {
        scanf("%d%d",&n,&rt);
        for (int i=1,u,v,w;i<n;i++) scanf("%d%d%d",&u,&v,&w),Add(u,v,w);
        DFS(rt,-1);
        for (int i=1;i<=n;i++) mx=max(mx,tme[i]);
        DFS(rt,-1,0);
        printf("%lld
    ",ans);
    }
    View Code
    在日渐沉没的世界里,我发现了你。
  • 相关阅读:
    序列化
    cookie 和 session
    a 标签提交表单
    SpringBoot使用Easypoi导出excel示例
    PDF操作类库 iText
    HandlerInterceptor
    Fastdfs
    InitializingBean
    CORS CorsFilter
    XMLHttpRequest
  • 原文地址:https://www.cnblogs.com/mastervan/p/10981274.html
Copyright © 2011-2022 走看看