牛客周赛 Round 117

题目 D:树变链的最少操作数

题目描述

小芳有一颗 n 个节点的树,但小红更喜欢链。为了把这棵树变成链,小红可以进行如下操作:

选择任意一条边,其连接两个点 u, v。将这条边断开后,在点 u 所在连通块中任选一个节点,向点 v 连边。

小红想知道,要把这棵树变成链最少需要几次操作?

输入描述

第一行输入一个整数 n(1 ≤ n ≤ 2×10⁵)。之后的 n−1 行,每行输入两个整数 uᵢ, vᵢ(1 ≤ uᵢ, vᵢ ≤ n),代表有一条边连接 uᵢ 和 vᵢ。

输出描述

输出一个整数,代表小红所需的最少次数。

示例 1

输入

51 21 31 44 5

输出

1

说明

一种可行的操作方法是断开点 1 和 3 间的边,之后在点 2 与点 3 间连边。

这道题我们可以先来考虑一下结果和初始状态有什么不同

先拿样例来说,最开始是最左边的树,经过操作变成了右边的链。

右边的链(但是看着有点像树)我们可以换个形式来看

这个样子看起来就好理解多了,那我们左图如何变成链呢?我们不难发现左图中1号点一定不是链中的点,为什么呢?

我们可以通过观察链的性质 :每个点的度不超过2,只在叶子结点度等于1。

所以我们可以想到需要去除1号点的某条边,使得能成为链中的点。

此时,我们可以想到答案的组成部分,把度大于2的点都存在起来if(deg>2):res+=(deg-2) res为答案,deg为度

那现在我们把deg大于2的部分都存起来了,该怎么接呢?

我们可以先把操作都存下来,不要着急操作,也就是把deg大于2的点存起来后不要着急接,因为我们最后的状态一定是一条链,我们无论是把deg大于2的点存下来后再去接,还是最后再去接都没有影响。这里可能有点抽象,我拿个样例演示一下

对于这颗树而言,度数大于2的点有:1,2,4,所以对于这三点,我们可以先拆连接1号点的某个边,存起来,此时有两种选择。

第一种选择,先存着,就像这样

第二种选择,分开边后立即进行连接,连到某个节点上去

因为这道题没有要求我们给出操作顺序,所以无论哪种操作都是合法的,那我们就可以选一个省心一点的方式,把所有的边都拆完了,在进行组装。

我们把度大于2的部分都拆下来了,那原本的树就变成了什么了?是不是就变成了若干个链了?,因为我们此时每个点的度数都小于等于2完全就是合法的。

拿我们上面举的这颗树的例子,我们把所有度大于2的部分都拆下来

最后首尾相接一下不就变成了链了吗?

所以答案就是i从1到n遍历if(degi>2):res+=(degi-2)

代码奉上

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int deg[N],n;
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    long long res=0;
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        deg[u]++,deg[v]++;
    }
    
    for(int i=1;i<=n;i++){
        res+=max(deg[i]-2,0);
    }
    cout<<res;
    return 0;
}

这道题其实教给我们两个点:

(1)当从开始状态推最终状态不好想时候,我们可以想想从最终状态到开始状态入手(正难则反)

(2)先把操作存下来,别急着进行操作

相关推荐
程序员夏洛5 分钟前
VMware Workstation Pro 卸载失败:安装向导提前结束、错误 1603 的排查与解决
java
User_芊芊君子9 分钟前
【JavaEE初阶 - 网络原理】网络分几层?从自定义协议聊到 DNS
java·网络·java-ee
白帽攻防录7 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
聚美智数7 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
十年Java程序媛7 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
我是人✓8 小时前
SpringBoot静态资源映射揭秘
java·spring boot·后端
2603_965148118 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe8 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
xixiaoyunya9 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的9 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全