1 条题解

  • 0
    @ 2025-10-8 17:09:32

    E90 换根DP P6419 COCI2014-2015#1 Kamp

    // 换根DP O(n)
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #define int long long
    using namespace std;
    
    int read(){
      int s=0; char c=getchar();
      while(isdigit(c))s=s*10+c-'0',c=getchar();
      return s;
    }
    const int N=500005;
    struct E{int v,w;};
    vector<E> e[N];
    int n,m,a[N],sz[N],d1[N],d2[N],pos[N],up[N];
    int f[N],g[N];
    
    void dfs(int u,int fa){
      sz[u]=a[u];
      for(E i:e[u]){
        int v=i.v,w=i.w;
        if(v==fa) continue;
        dfs(v,u);
        if(sz[v]){
          f[u]+=f[v]+2*w;
          if(d1[u]<d1[v]+w)
            d2[u]=d1[u],d1[u]=d1[v]+w,pos[u]=v;
          else if(d2[u]<d1[v]+w) d2[u]=d1[v]+w;
        }
        sz[u]+=sz[v];
      }
    }
    void dfs2(int u,int fa){
      for(E i:e[u]){
        int v=i.v,w=i.w;
        if(v==fa) continue;
        if(m-sz[v]){
          g[v]=g[u]+(f[u]-f[v]);
          if(!sz[v]) g[v]+=2*w;
          if(pos[u]==v) up[v]=max(up[u],d2[u])+w;
          else up[v]=max(up[u],d1[u])+w;
        }
        dfs2(v,u);
      }
    }
    signed main(){
      n=read();m=read();
      for(int i=1,x,y,w;i<n;i++){
        x=read(),y=read(),w=read();
        e[x].push_back({y,w});
        e[y].push_back({x,w});
      }
      for(int i=1;i<=m;i++) a[read()]++;
      dfs(1,0);
      dfs2(1,0);
      for(int i=1;i<=n;i++)
        printf("%lld\n",f[i]+g[i]-max(up[i],d1[i]));
    }
    
    
    • 1

    信息

    ID
    5408
    时间
    2000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    71
    已通过
    15
    上传者