2020牛客暑期多校训练营Cover the Tree(构造,dfs序)

该博客讨论了如何解决一个图论问题——在给定的无根树中找到最少的链来覆盖所有边。作者指出,每个叶节点都需要被覆盖,因此所需的链数至少为叶节点数量的一半向上取整。他们提出了一个覆盖策略,即通过DFS序对叶节点编号,然后根据链的数量进行对应匹配。博客包含了问题描述、输入输出格式、示例、分析和解决方案代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cover the Tree

题目描述

在这里插入图片描述

输入描述:

在这里插入图片描述

输出描述:

在这里插入图片描述

示例1

输入

5
1 2
1 3
2 4
2 5

输出

2
2 3
4 5

说明

在这里插入图片描述

题目大意

给定一个k个节点的无根树,求最少的链覆盖树上的所有边。并输出覆盖方式(链的两边的节点编号)(SPJ)。

分析

一看就想到和叶节点有关。由于每个叶节点一定要覆盖到,则若有n个叶节点,则必要n/2向上取整的链才能覆盖到所有叶节点,并且这些链可以同时覆盖其他边。
于是,链的数量就求出来了,重点是覆盖的策略。一开始写的好像可以hack掉

覆盖策略

先用dfs序将每个叶节点编号,然后以ans/2为界,一一对应做链即可。经过长期实验+数百次WA+官方题解易得

代码

#include<bits/stdc++.h>
#define ll long long
#define inf 1<<30
using namespace std;
const int MAXN=2e5+100;
vector<int> vec[MAXN];
int a[MAXN<
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值