1 条题解

  • 0
    @ 2025-11-13 10:37:30

    E77 树上背包 P1272 重建道路

    // 树上背包 O(n*n)
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #define N 10050
    using namespace std;
     
    int read(){
      int d=0;char ch=getchar();
      while(!isdigit(ch))ch=getchar();
      while(isdigit(ch)){d=d*10+ch-48;ch=getchar();}
      return d;
    }
    vector<int>e[N];
    int n,p,ans,du[N],sz[N],f[N][N];
    
    void dfs(int u){
      sz[u]=1;
      for(int v:e[u]){
        dfs(v);
        sz[u]+=sz[v];
        for(int j=sz[u];j>=1;j--) //节点数
          for(int k=1;k<j;k++)    //决策
            f[u][j]=min(f[u][j],f[u][j-k]+f[v][k]-2);
      }
    }
    int main(){
      n=read();p=read();
      for(int i=1,x,y;i<n;i++){
        x=read();y=read();
        du[x]++; du[y]++; e[x].push_back(y);
      }
      memset(f,0x3f,sizeof(f));
      for(int i=1;i<=n;i++) f[i][1]=du[i];
      dfs(1);
      ans=f[1][p];
      for(int i=2;i<=n;i++)ans=min(ans,f[i][p]);
      printf("%d",ans);
      return 0;
    }
    
    
    • 1

    E77 树上背包 P1272 重建道路(数据加强)

    信息

    ID
    1456
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    73
    已通过
    23
    上传者