首页 > 其他分享 >P1272 重建道路

P1272 重建道路

时间:2024-08-12 10:30:44浏览次数:7  
标签:sz 结点 le 牲口棚 int 道路 P1272 重建

题目

点击查看题目

题目描述

一场可怕的地震后,人们用 \(N\) 个牲口棚(编号 \(1\sim N\))重建了农夫 John 的牧场。由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是唯一的。因此,牧场运输系统可以被构建成一棵树。

John 想要知道另一次地震会造成多严重的破坏。有些道路一旦被毁坏,就会使一棵含有 \(P\) 个牲口棚的子树和剩余的牲口棚分离,John 想知道这些道路的最小数目。

限制与约定

\(1\le N\le 150\),\(1\le P\le N\),保证给出的是一棵树。

思路

设 \(f_{i, j}\) 表示以点 \(i\) 为子树,保留 \(j\) 个结点需要删除的边的最小值。

初始状态:\(f_{i, 1} = 与结点 i 相连的点的个树\),即只保留一个点,就需要把所有子结点割掉。

状态转移:\(f_{u, j} = \min(f_{u, j}, f_{u, j - k} + f_{to, k} - 1)\),因为要保留以 \(to\) 为子树的一些结点,所以撤销删除 \(u\) 到 \(to\) 的那条边。注意和 01 背包一样要倒序枚举。

答案:对于根结点 1,答案为 \(f_{1, p}\);对于其他结点 \(u\):答案为 \(f_{u, p} + 1\),因为要断掉它和父结点的关系,要多删一条边。

代码

细节巨多。

#include <bits/stdc++.h>

using namespace std;

const int N = 210;

int n, p;
vector<int> e[N];
int f[N][N], sz[N];

void dfs(int u) {
    f[u][1] = e[u].size();
    sz[u] = 1;
    for (auto to : e[u]) {
        dfs(to);
        sz[u] += sz[to];
        for (int j = sz[u]; j >= 1; j--) {// j 只能到 1
            for (int k = 1; k <= min(sz[to], j - 1); k++) {// k 要从 1 开始
                f[u][j] = min(f[u][j], f[u][j - k] + f[to][k] - 1);// 注意:-1
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> p;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        e[u].push_back(v);
    }

    memset(f, 0x3f, sizeof(f));
    dfs(1);
    int ans = f[1][p];// 特殊处理根结点
    for (int i = 2; i <= n; i++) ans = min(ans, f[i][p] + 1);// 其他结点要 +1!
    cout << ans << '\n';
    return 0;
}

标签:sz,结点,le,牲口棚,int,道路,P1272,重建
From: https://www.cnblogs.com/Yuan-Jiawei/p/18354438

相关文章

  • 在程序员的道路上,什么关键的概念或技术让你感到自身技能有了显著飞跃
    在程序员的道路上,什么关键的概念或技术让你感到自身技能有了显著飞跃对于程序员来说,在编程的世界里,程序员的成长之路往往充满了挑战与突破。作为程序员,在面对每一个关键概念的理解和技术的掌握都像是攀登山峰的一个个台阶,也正是不断地挑战才使得程序员不断向前,更上一层......
  • 3244. 新增道路查询后的最短距离 II
    原题链接题解建桥相当于把区间内的路合并起来,这引导我们用并查集维护可是具体如何实现呢?我们令桥内的所有节点的统一指向最右端点作为首领,然后对于桥内的所有小桥,每次更新完了之后往右边走一格codeclassSolution{public:intfa[2000005];intfinds(intnow){r......
  • Open3D 三维重建-Delaunay Triangulation (德劳内三角剖分)
    目录一、概述1.1原理1.2实现步骤1.3应用二、代码实现2.1关键函数2.2完整代码三、实现效果3.1原始点云3.2重建后点云Open3D点云算法汇总及实战案例汇总的目录地址:Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客一、概述        德劳内三角剖......
  • Open3D 三维重建-Alpha Shapes (α-形状)
    目录一、概述1.1原理1.2实现步骤二、代码实现2.1关键函数2.1.1函数2.1.2参数详解2.2完整代码三、实现效果3.1原始点云3.2处理后点云Open3D点云算法汇总及实战案例汇总的目录地址:Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客一、概述      ......
  • 一维变分自动编码器的错误重建
    我想实现一个变分自动编码器,它将一维Numpy数组(声音文件的波形)作为输入。运行该文件不会引发错误,但损失收敛到2000左右,并且重建看起来像纯粹的噪声。我使用了Goffinet等人的代码并尝试重写它以采用一维输入,因为我之前使用过他们的(二维)VAE。这是网络和转发功能的......
  • 代码随想录算法训练营第二十五天|134. 加油站、135. 分发糖果、860.柠檬水找零、406.
    写代码的第二十五天继续贪心!!gogogo!134.加油站思路贪心算法总让我有种脑子知道每次怎么计算,但是写不出来,也想不出贪心贪在哪里了,就只是觉得应该这么做。。。。。本题中大家可以按照自己的计算方法一步一步模拟一下这个过程,然后会发现其实每次都是要计算每站剩余的油量,......
  • 新书推荐:《码农职场:IT 人求职就业手册》——照亮你的职业道路
    ......
  • 合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测等技术应用
     合成孔径雷达干涉测量(InterferometricSyntheticApertureRadar,InSAR)技术作为一种新兴的主动式微波遥感技术,凭借其可以穿过大气层,全天时、全天候获取监测目标的形变信息等特性,已在地表形变监测、DEM生成、滑坡、火山活动、冰川运动、人工建筑物形变信息提取等多种领域展开......
  • 三维点云中常用的表面重建算法
    表面重建算法起源于计算机视觉和计算几何学领域。早期的研究集中在从二维图像中提取三维信息。然而,随着三维扫描技术的进步,越来越多的研究转向了如何从点云数据中重建表面。三维点云表面重建技术的发展,始于20世纪90年代,主要推动力是激光扫描和结构光扫描的广泛应用。Resulto......
  • 立交桥 API 和道路车道
    我用Python编写了一个脚本,给定纬度/经度,生成包含道路边缘、人行横道和车道的geojson。它看起来像这样:deffetch_intersection_data(lat,lon,radius:int=20):"""FetchintersectiondatafromOpenStreetMapusingOverpassAPIandconverttoGeoJSON.......