【补题】Codeforces Global Round 26 E. Shuffle

题意:给出一棵树,按照以下方式操作
对于当前的所有任意子树,选出任何一个点从中删除,然后作为新子树的根插入到新的树中,以此递归往复,直到原来的树中节点全部进入新树,问新树最多有多少个叶子节点。
然后如果根节点只有一个联通的点,那么自己也算叶子

思路:Codeforces Global Round 26 (A - E) - Lu_xZ - 博客园

1.首先对于题意进行解析,这个操作是在干什么,然后发现,任意相邻的节点不能同时为叶子节点,然后如果我们把叶子节点归为一类,就会发现所有的叶子节点就是最大独立集
最大独立集:选出的点集中,任何一个子集都不满足在原图上可以互相抵达
举例:1-2-3-4-5-6,1作为根节点可以跟3连,2就变成了子节点,4-5-6作为新的子树
也就是说为什么发现的,任何一个点想成为叶子节点,只要在当前子树中选择一个相邻节点,自己就可以变成叶子节点

2.发现是最大独立集,那么接下来该如何是好?因为任何一个点都可能成为根节点,于是乎考虑换根dp,这个应该要稍微靠一点感觉……
任何一个节点的子树所选中的状态不会因为另外一边子树的状态受影响,这是换根dp的关键,因为这样才能顺序的求出

3.于是乎开始dp,首先求出假设某一个节点是根节点的子树选择情况,这里就默认选1了

 f[3]代表3节点的情况,但是要分类f[3][0/1],代表图中形状的子树3节点作为叶子节点和不是叶子节点的情况
之后得到状态转移方程
f[x][0]+=max(f[u][0],f[u][1])   当前节点不是叶子节点,那么相邻节点可以是叶子节点也可以不是
f[x][1]+=f[u][0]    当前节点是叶子节点,相邻节点只能不是叶子节点


接下来换根

假设以2为根,f[2]所拥有的状态只是红色部分子树,而另一边就可以由父节点减去当前子树得到
然后在此基础上进行拼接,就完成了换根的操作

然后因为另一边子树只受到子树根节点的影响,所以才能进行换根dp
我们将橙色区域称为temp(f[1]-f[2])
那么新的dp转移
g[x][0]=std::max(g[fa][1],f[x][0]+temp);   g[fa][1]其实跟f[2][0]+(f[1]-f[2])[1]是一致的,然后另一种拼接求最多的那个
g[x][1]=temp+f[x][1];

完成dp的状态转移
最后求答案g[x][0]+(ve[x].size()==1); 
ve[x].size()==1是因为根节点本身可能也是叶子节点,但在dp的过程中,自己作为叶子节点是不可以的,是别人作为非叶子节点的,自己才可以选择作为叶子节点,根作为第一个节点没有能力选择一个父节点作为非叶子节点,只能是自己,先有非叶子节点,才有叶子节点
任何一个点想成为叶子节点,只要在当前子树中选择一个相邻节点,自己就可以变成叶子节点

扫描完成全部,那么本道题就结束了

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS                       \std::ios::sync_with_stdio(0); \std::cin.tie(0);              \std::cout.tie(0)const int N = 3e5 + 5;
const int INF = 1e18;
const int MOD = 998244353;
// const int MOD=1e9+7;
// const int MOD=100003;
const int maxn=5e5+10;std::vector<int> ve[N];
int f[N][2];
int g[N][2];void dfs(int x,int fa){f[x][0]=0;f[x][1]=1;for(auto i : ve[x]){if(i==fa) continue;dfs(i,x);f[x][1]+=f[i][0];f[x][0]+=std::max(f[i][0],f[i][1]);}
}int ans=0;
void dfs2(int x,int fa){int temp=g[fa][0]-std::max(f[x][0],f[x][1]);g[x][1]=temp+f[x][1];g[x][0]=std::max(g[fa][1],f[x][0]+temp);temp=g[x][0]+(ve[x].size()==1);ans=std::max(ans,temp);for(auto i : ve[x]){if(i==fa) continue;dfs2(i,x);}
}void solve(){int n;std::cin >> n;ans=0;for(int i=1;i<=n;i++){ve[i].clear();f[i][0]=f[i][1]=g[i][0]=g[i][1]=0;}for(int i=1;i<n;i++){int x,y;std::cin >> x >> y;ve[x].push_back(y);ve[y].push_back(x);}    dfs(1,0);g[1][0]=f[1][0];g[1][1]=f[1][1];ans=g[1][0]+(ve[1].size()==1);for(auto i : ve[1])dfs2(i,1);std::cout << ans << '\n';
}signed main()
{IOS;int t = 1;std::cin >> t;while (t--){solve();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90023.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金仓数据库风云

O 记我用了这么多年&#xff0c;我最有发言权&#xff0c;我可不敢替&#xff0c;你们谁能搞定&#xff0c;谁上。” 老邓在会上&#xff0c;狠狠甩了一句气话。老邓&#xff08;邓铭&#xff09;&#xff0c;某大型期货交易所信息化主管&#xff0c;数据库老司机。 作为圈里最…

阿里云宝塔Linux面板相关操作记录

1、清空nginx缓存使用Nginx时&#xff0c;静态图片文件会出现缓存&#xff0c;所以需要清空缓存&#xff0c;方法如下&#xff1a;sudo rm -rf /www/server/nginx/proxy_cache_dir/*2、Windows启动spring boot jar脚本echo off setlocal enabledelayedexpansion:: 配置项目名 s…

Kotlin伴生对象

你已经知道如何为类创建单例对象&#xff08;singleton&#xff09;。不过&#xff0c;在很多情况下&#xff0c;你只需要为某个类维护一个单例&#xff0c;这时候使用类的完整名字会显得冗长。比如&#xff0c;你可能只需要存储一个公共的属性。这种情况下&#xff0c;可以用 …

4G车载录像机的作用详解:提升行车安全与智能管理的核心技术

1. 引言随着物流运输、公共交通、特种车辆等行业对安全与管理需求的提升&#xff0c;4G车载录像机已成为现代车辆智能化管理的重要组成部分。它不仅具备传统行车记录仪的录像功能&#xff0c;还结合4G无线通信、AI智能分析、GPS定位、云存储等技术&#xff0c;实现远程监控、实…

技术与情感交织的一生 (十)

目录 笑傲江湖 上 恨 嫌隙 挣扎 救难 论道 取巧 联手 入魔 决裂 治伤 聚气 倾心 笑傲江湖 上 恨 身边的许多朋友都是金庸武侠迷&#xff0c;我也是其中之一。有人说&#xff0c;我的技术像 “任我行” &#xff0c;“吸星大法” 学到最后显得不伦不类&#xf…

架构进阶——解读集团IT管控治理体系总体规划【附全文阅读】

集团IT管控治理体系正步入高质量发展阶段&#xff0c;旨在重塑信息化管理价值&#xff0c;解决集团化管理的核心挑战。首要问题是纵向与横向的协同管控&#xff0c;需明确各层级在集团战略决策中的角色与责任&#xff0c;促进跨部门、跨子公司的高效协同。高管激励机制与人才梯…

亚马逊自养号测评实战指南:从环境搭建到安全提排名

在亚马逊平台上&#xff0c;自养号测评系统的成败差异主要源于技术合规性、操作精细度和风控策略的差异。以下是关键因素的分析&#xff1a;&#x1f512; 一、环境隔离与伪装技术底层环境稳定性成功案例&#xff1a;采用独立服务器硬件参数伪装&#xff08;如唯一MAC地址、IME…

CSS中的transform

在 CSS 中&#xff0c;transform 是用于用于用于对元素进行几何变换的属性&#xff0c;可实现旋转、缩放、平移、倾斜等效果&#xff0c;且不会影响其他元素的布局&#xff08;不会触发重排&#xff09;。以下是其核心用法和特性&#xff1a; 1. 基本语法 element {transform: …

MyBatis拦截器插件:实现敏感数据字段加解密

文章目录一、写在前面二、编码实现1、注解2、拦截器插件3、配置插件4、实体类5、测试三、扩展1、优化点一、写在前面 日常开发中&#xff0c;经常有一些敏感数据&#xff0c;直接写入数据库的话&#xff0c;很容易泄露。 本文基于mybatis拦截器插件&#xff0c;实现敏感数据的…

C++_Hello算法_队列

队列&#xff08;queue&#xff09;是一种遵循先入先出规则的线性数据结构。顾名思义&#xff0c;队列模拟了排队现象&#xff0c;即新来的人不断加入队列尾部&#xff0c;而位于队列头部的人逐个离开。 如图 5-4 所示&#xff0c;我们将队列头部称为“队首”&#xff0c;尾部…

LeetCode 1.

问题描述 俩数之和&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按…

c练习-c基础

#include <stdio.h>int main() {//打印数组中的最大值int arr[10];int max,i;for (i 0; i < 10; i){scanf_s("%d", &arr[i]);}max arr[0];for (i 0; i < 10; i){if(max < arr[i 1]){max arr[i 1];}}printf("数组中最大值&#xff1a;%…

Numpy科学计算(五分钟小白从入门到精通)

2.1 numpy介绍numpy是Python中科学计算的基础包。它是一个Python库&#xff0c;提供多维数组对象、各种派生对象&#xff08;例如掩码数组和矩阵&#xff09;以及用于对数组进行快速操作的各种方法&#xff0c;包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基…

从零掌握微服务通信安全:mTLS全解析

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 在云原生时代&#xff0c;微服务架构的普及带来了灵活性和可扩展性&#xff0c;但也让服务间通信的安全性成为核心挑战。mTLS&#xff08;Mutual TLS&…

Node.js net.Socket.destroy()深入解析

socket.destroy() 是 Node.js net 模块中用于强制销毁 TCP 套接字的方法&#xff0c;比 socket.end() 更彻底。下面我将从多个方面全面讲解这个方法。 基本用法 const net require(net);const server net.createServer((socket) > {// 强制销毁套接字socket.destroy(); })…

vmware 克隆虚拟机,报错:克隆时出错:指定不存在的设备。然后电脑卡死,只能强制关机再开机。

vmware 克隆虚拟机&#xff0c;报错&#xff1a;克隆时出错:指定不存在的设备。然后电脑卡死&#xff0c;只能强制关机再开机。1、问题描述2、问题原因3、解决方法1、问题描述 vmware 版本&#xff1a;vmware workstation pro 17.6.3 克隆虚拟机时&#xff0c;创建完整克隆&am…

如何使用Python将任意PPT变为“智能模板”(解决 python-pptx 替换元素无法保留格式的问题,阴影、填充等属性保留!)

文章目录 📖 介绍 📖 🏡 演示环境 🏡 📒 深入 OpenXML:格式保留的终极武器 📒 🚀 如何打造你自己的“格式保留”PPT模板? 🧐 为什么格式会丢失? 🖼️ 方案一:图片的“格式移植”大法 🛠️ 实现代码 🔹 原理解析 ✍️ 方案二:文本的“外科手术”大法…

学习python中离线安装pip及下载package的方法

正常而言&#xff0c;Python 3.4及以上版本默认自带pip工具‌&#xff0c;无需额外安装&#xff0c;如果需要单独离线安装pip&#xff0c;可以先使用DeepSeek查看指定操作系统能安装的最高pip版本&#xff0c;然后在参考文献1中现在指定版本的pip离线安装文件&#xff0c;通常为…

liunx运维进阶脚本

一、文件与目录操作1.快速创建目录树mkdir -p project/{src,doc,test/{unit,integration}}创建嵌套目录结构&#xff0c;避免逐层创建。2查找并删除7天前的日志文件find /var/log -name "*.log" -mtime 7 -exec rm -f {} \;结合find和exec实现定时清理。3.批量重命名…

Apache Ignite 中的 SQL 模式(Schema)管理机制

这段内容讲的是 Apache Ignite 中的 SQL 模式&#xff08;Schema&#xff09;管理机制。我们可以从几个方面来理解&#xff1a; 一、什么是 Schema&#xff08;模式&#xff09;&#xff1f; 在 SQL 中&#xff0c;Schema 是数据库对象&#xff08;如表、视图等&#xff09;的…