2 条题解

  • 0
    @ 2025-10-8 17:00:50
    #include <bits/stdc++.h>
    using namespace std;
    const int N=200;
    int f[N][N], d[N], n, p;
    vector<int> G[N];
    void dfs(int x, int fa){
        f[x][1]=d[x];
        for(int y: G[x]) if(y!=fa){
            dfs(y, x);
            for(int i=p; i>=1; i--){
                for(int j=1; j<i; j++){
                    f[x][i]=min(f[x][i], f[x][j]+f[y][i-j]-2);
                }
            }
        }
    }
    int main(){
        scanf("%d%d", &n, &p);
        memset(d, 0, sizeof(d));
        for(int i=1; i<n; i++){
            int x, y; scanf("%d%d", &x, &y);
            G[x].push_back(y);
            G[y].push_back(x);
            d[x]++; d[y]++; 
        } 
        memset(f, 0x3f, sizeof(f));
        dfs(1, 0);
        int ans=0x3f3f3f3f;
        for(int i=1; i<=n; i++) ans=min(ans, f[i][p]);
        printf("%d\n", ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:00:39
      #include<bits/stdc++.h>
      using namespace std;
      const int N=200;
      int f[N][N], d[N], n, p;
      vector<int> G[N];
      void dfs(int x, int fa){
      	f[x][1]=d[x];
      	for(int y: G[x]) if(y!=fa){
      		dfs(y, x);
      		for(int i=p; i>=1; i--){
      			for(int j=1; j<i; j++){
      				f[x][i]=min(f[x][i], f[x][j]+f[y][i-j]-2);
      			}
      		}
      	}
      }
      int main(){
      	scanf("%d%d", &n, &p);
      	memset(d, 0, sizeof(d));
      	for(int i=1; i<n; i++){
      		int x, y; scanf("%d%d", &x, &y);
      		G[x].push_back(y);
      		G[y].push_back(x);
      		d[x]++; d[y]++; 
      	} 
      	memset(f, 0x3f, sizeof(f));
      	dfs(1, 0);
      	int ans=0x3f3f3f3f;
      	for(int i=1; i<=n; i++) ans=min(ans, f[i][p]);
      	printf("%d\n", ans);
      	return 0;
      }
      • 1

      USACO(125)动态规划(树形DP)3:切断道路[Rebuilding Roads&#44; Feb 2002]

      信息

      ID
      2316
      时间
      1000ms
      内存
      128MiB
      难度
      9
      标签
      递交数
      12
      已通过
      7
      上传者