当前位置: 首页 > article >正文

Python获取能唯一确定一棵给定的树的最少数量的拓扑序列

称一个 1 1 1~ n n n的排列 { p } = { p 1 , p 2 , ⋯ , p n } \{p\}=\{p_1,p_2,\cdots,p_n\} {p}={p1,p2,,pn}是一棵n个点、点编号为 1 1 1 n n n的树 T T T的拓扑序列,当且仅对于任意 1 ≤ i < n 1\leq i<n 1i<n,恰好存在唯一的 j > i j>i j>i满足 p i p_i pi p j p_j pj之间有连边。
给定树 T T T,你需要给出尽可能少的该树的拓扑序列 { p 1 } , { p 2 } , ⋯ , { p k } \{p_1\},\{p_2\},\cdots,\{p_k\} {p1},{p2},,{pk},使得有且仅有树T满足 { p 1 } , { p 2 } , ⋯ , { p k } \{p_1\},\{p_2\},\cdots,\{p_k\} {p1},{p2},,{pk}均为该树的合法拓扑序列。
【输入格式】
从标准输入读入数据。
本题有多组测试数据。输入第一行一个正整数 T T T,表示测试数据组数,接下来依次输入每组测试数据。
对于每组数据,输入第一行一个正整数 n n n,表示给定树的大小。接下来 n − 1 n-1 n1行,每行两个正整数 u u u, v v v描述树中存在的一条边。

【输出格式】
输出到标准输出。
对于每组数据,输出第一行一个正整数k表示你给出的拓扑序列数量,接下来k行,每行输出一个 1 n 1~n 1 n的排列,描述你给出的拓扑序列。你需要保证 1 ≤ k ≤ n 1\leq k\leq n 1kn,且这 k k k个拓扑序列均为对应输入的合法拓扑序列,且只有一棵树满足这些拓扑序列都是其合法拓扑序列。
【样例1输入】

1
2
5
2 3
3 1
5 1
5 4
5
1 4
2 3
3 1
5 3

【样例输出】

2
2 3 1 5 4
4 5 1 3 2
2
4 1 5 3 2
2 5 3 4 1

【子任务】

  • 描述了对于所有测试数据的要求:1 ≤ T ≤ 100,3 ≤ n ≤ 100,1 ≤ u, v ≤ n。
  • 本题共有两个测试点。
  • 测试点编号、分值、T 和 n 的具体信息如下:
    • 测试点1:分值20,T = 10,n = 10。
    • 测试点2:分值80,T = 10^2,n = 10^2。
  • 特别说明:所有测试点中每组数据均为从所有 n 个点的有标号树中等概率随机选择生成的。
    为了解决这个问题,我们需要构造尽可能少的拓扑序列,使得这些序列能够唯一确定给定的树结构。通过分析问题,我们可以利用树的直径的两个端点来生成两个拓扑序列,这两个序列的组合可以唯一确定树的结构。

以下方法通过利用树的直径的两个端点生成两个不同的拓扑序列,确保这两个序列的组合能够唯一确定原树的结构,从而满足题目要求。

方法思路

  1. 确定树的直径:树的直径是树中最长的路径。通过两次广度优先搜索(BFS)可以找到直径的两个端点。
  2. 生成拓扑序列:分别以直径的两个端点作为根节点,生成两个拓扑序列。每次选择离根节点最远的叶子节点,直到只剩下根节点。

解决代码

import sys
from collections import deque
import copydef main():input = sys.stdin.read().split()ptr = 0T = int(input[ptr])ptr +=1for _ in range(T):n = int(input[ptr])ptr +=1adj = [[] for _ in range(n+1)]for __ in range(n-1):u = int(input[ptr])v = int(input[ptr+1])ptr +=2adj[u].append(v)adj[v].append(u)# Find diameter endpointsdef bfs(start):visited = [False]*(n+1)q = deque([start])visited[start] = Truelast_node = startdistance = 0dist = [0]*(n+1)while q:for _ in range(len(q)):u = q.popleft()for v in adj[u]:if not visited[v]:visited[v] = Truedist[v] = dist[u] +1q.append(v)last_node = vif q:distance +=1return (last_node, dist)u, _ = bfs(1)v_end, dist_v = bfs(u)v = v_endu_end, dist_u = bfs(v)u = u_enddef generate_sequence(root):seq = []removed = [False]*(n+1)parent = [0]*(n+1)current_adj = copy.deepcopy(adj)for _ in range(n-1):# Compute distances from root using BFS on remaining nodesdist = [-1]*(n+1)q = deque()q.append(root)dist[root] =0while q:u_node = q.popleft()for v_node in current_adj[u_node]:if not removed[v_node] and dist[v_node] == -1:dist[v_node] = dist[u_node] +1parent[v_node] = u_nodeq.append(v_node)# Find leaves (degree 1 in current tree) not rootleaves = []for node in range(1, n+1):if removed[node] or node == root:continuecnt =0for neighbor in current_adj[node]:if not removed[neighbor]:cnt +=1if cnt ==1:leaves.append(node)if not leaves:break# Select the leaf with maximum distance to rootmax_dist = -1selected = Nonefor leaf in leaves:if dist[leaf] > max_dist:max_dist = dist[leaf]selected = leafseq.append(selected)removed[selected] = True# Update parent's degree is handled implicitly by 'removed'seq.append(root)return seqs1 = generate_sequence(u)s2 = generate_sequence(v)# Outputprint(2)print(' '.join(map(str, s1)))print(' '.join(map(str, s2)))if __name__ == '__main__':main()

代码解释

  1. 输入处理:读取输入数据并构建树的邻接表。
  2. 确定直径端点:通过两次BFS找到树的直径的两个端点。
  3. 生成拓扑序列:以每个直径端点为根,生成拓扑序列。每次选择离根节点最远的叶子节点,直到只剩下根节点。
  4. 输出结果:输出两个拓扑序列,确保它们唯一确定原树的结构。

相关文章:

Python获取能唯一确定一棵给定的树的最少数量的拓扑序列

称一个 1 1 1~ n n n的排列 { p } { p 1 , p 2 , ⋯ , p n } \{p\}\{p_1,p_2,\cdots,p_n\} {p}{p1​,p2​,⋯,pn​}是一棵n个点、点编号为 1 1 1至 n n n的树 T T T的拓扑序列&#xff0c;当且仅对于任意 1 ≤ i < n 1\leq i<n 1≤i<n&#xff0c;恰好存在唯一的 j &…...

PyTorch中的movedim、transpose与permute

在PyTorch中&#xff0c;movedim、transpose 和 permute这三个操作都可以用来重新排列张量&#xff08;tensor&#xff09;的维度&#xff0c;它们功能相似却又有所不同。 movedim &#x1f517; torch.movedim 用途&#xff1a;将张量的一个或多个维度移动到新的位置。参数&…...

C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?

匿名方法本质上是一种没有显式名称的方法&#xff0c;它可以作为参数传递给需要委托类型的方法&#xff0c;常用于事件处理、回调函数等场景&#xff0c;能够让代码更加简洁和紧凑。 使用场景 事件处理&#xff1a;在处理事件时&#xff0c;不需要为每个事件处理程序单独定义…...

四、jQuery笔记

(一)jQuery概述 jQuery本身是js的一个轻量级的库,封装了一个对象jQuery,jquery的所有语法都在jQuery对象中 浏览器不认识jquery,只渲染html、css和js代码,需要先导入jQuery文件,官网下载即可 jQuery中文说明文档:https://hemin.cn/jq/ (二)jQuery要点 1、jQuery对象 …...

SQL进阶实战技巧:如何构建用户行为转移概率矩阵,深入洞察会话内活动流转?

目录 1 场景描述 1.1 用户行为转移概率矩阵概念 1.2 用户行为转移概率矩阵构建方法 (1) 数据收集...

TCP/IP 协议:互联网通信的基石

TCP/IP 协议:互联网通信的基石 引言 TCP/IP协议,全称为传输控制协议/互联网协议,是互联网上应用最为广泛的通信协议。它定义了数据如何在网络上传输,是构建现代互联网的基础。本文将深入探讨TCP/IP协议的原理、结构、应用以及其在互联网通信中的重要性。 TCP/IP 协议概述…...

第25节课:前端缓存策略—提升网页性能与用户体验

目录 前端缓存的重要性HTTP缓存HTTP缓存的基本原理常见的HTTP缓存头Cache-ControlExpiresETagLast-Modified HTTP缓存的类型强缓存协商缓存 服务端渲染与SSR服务端渲染&#xff08;SSR&#xff09;简介SSR的优势SSR的挑战实践&#xff1a;使用SSR框架构建Web应用Next.js安装Nex…...

完美世界C++游戏开发面试题及参考答案

堆栈数据结构有什么区别,举例说明 栈(Stack)和堆(Heap)是两种不同的数据结构,它们在多个方面存在显著区别: 存储方式 栈:栈是一种后进先出(LIFO)的数据结构,它的存储空间是连续的。栈由系统自动分配和释放,用于存储函数调用时的局部变量、函数参数、返回地址等信息…...

LabVIEW无人机航线控制系统

介绍了一种无人机航线控制系统&#xff0c;该系统利用LabVIEW软件与MPU6050九轴传感器相结合&#xff0c;实现无人机飞行高度、速度、俯仰角和滚动角的实时监控。系统通过虚拟仪器技术&#xff0c;有效实现了数据的采集、处理及回放&#xff0c;极大提高了无人机航线的控制精度…...

AtCoder Beginner Contest 391(ABCDE)

A - Lucky Direction 翻译&#xff1a; 给你一个字符串 D&#xff0c;代表八个方向&#xff08;北、东、西、南、东北、西北、东南、西南&#xff09;之一。方向与其代表字符串之间的对应关系如下。 北&#xff1a; N东&#xff1a; E西&#xff1a; W南&#xff1a; S东…...

MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译

感谢阅读 注意不含评估以后的翻译原论文地址标题以及摘要介绍部分MiniRAG 框架2.1 HETEROGENEOUS GRAPH INDEXING WITH SMALL LANGUAGE MODELS2.2 LIGHTWEIGHT GRAPH-BASED KNOWLEDGE RETRIEVAL2.2.1 QUERY SEMANTIC MAPPING2.2.2 TOPOLOGY-ENHANCED GRAPH RETRIEVAL 注意不含评…...

HTB:LinkVortex[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用gobuster对靶机进行路径FUZZ 使用ffuf堆靶机…...

3D图形学与可视化大屏:什么是材质属性,有什么作用?

一、颜色属性 漫反射颜色 漫反射颜色决定了物体表面对入射光进行漫反射后的颜色。当光线照射到物体表面时&#xff0c;一部分光被均匀地向各个方向散射&#xff0c;形成漫反射。漫反射颜色的选择会直接影响物体在光照下的外观。例如&#xff0c;一个红色的漫反射颜色会使物体在…...

什么是门控循环单元?

一、概念 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Cho等人在2014年提出。GRU是LSTM的简化版本&#xff0c;通过减少门的数量和简化结构&#xff0c;保留了LSTM的长时间依赖…...

基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)

酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1) 用户信息管理 (2) 酒店管理员管理 (3) 房间信息管理 2、小程序序会员模块的实现 &#xff08;1&#xff09;系统首页 &#xff…...

Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具

前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转…...

Java-数据结构-优先级队列(堆)

一、优先级队列 ① 什么是优先级队列&#xff1f; 在此之前&#xff0c;我们已经学习过了"队列"的相关知识&#xff0c;我们知道"队列"是一种"先进先出"的数据结构&#xff0c;我们还学习过"栈"&#xff0c;是"后进先出"的…...

爬虫基础(四)线程 和 进程 及相关知识点

目录 一、线程和进程 &#xff08;1&#xff09;进程 &#xff08;2&#xff09;线程 &#xff08;3&#xff09;区别 二、串行、并发、并行 &#xff08;1&#xff09;串行 &#xff08;2&#xff09;并行 &#xff08;3&#xff09;并发 三、爬虫中的线程和进程 &am…...

C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】

1. 题目描述 力扣在线OJ题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 输入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 输出&#xff1a;[9,4] 2. 思路 直接暴力…...

Tailwind CSS - Tailwind CSS 引入(安装、初始化、配置、引入、构建、使用 Tailwind CSS)

一、Tailwind CSS 概述 Tailwind CSS 是一个功能优先的 CSS 框架&#xff0c;它提供了大量的实用类&#xff08;utility classes&#xff09;&#xff0c;允许开发者通过组合这些类来快速构建用户界面 Tailwind CSS 与传统的 CSS 框架不同&#xff08;例如&#xff0c;Bootstr…...

Sqoop导入MySQL中含有回车换行符的数据

个人博客地址&#xff1a;Sqoop导入MySQL中含有回车换行符的数据 MySQL中的数据如下图&#xff1a; 检查HDFS上的目标文件内容可以看出&#xff0c;回车换行符位置的数据被截断了&#xff0c;导致数据列错位。 Sqoop提供了配置参数&#xff0c;在导入时丢弃掉数据的分隔符&…...

LightM-UNet(2024 CVPR)

论文标题LightM-UNet: Mamba Assists in Lightweight UNet for Medical Image Segmentation论文作者Weibin Liao, Yinghao Zhu, Xinyuan Wang, Chengwei Pan, Yasha Wang and Liantao Ma发表日期2024年01月01日GB引用> Weibin Liao, Yinghao Zhu, Xinyuan Wang, et al. Ligh…...

stm32硬件实现与w25qxx通信

使用的型号为stm32f103c8t6与w25q64。 STM32CubeMX配置与引脚衔接 根据stm32f103c8t6引脚手册&#xff0c;采用B12-B15四个引脚与W25Q64连接&#xff0c;实现SPI通信。 W25Q64SCK&#xff08;CLK&#xff09;PB13MOSI&#xff08;DI&#xff09;PB15MISO(DO)PB14CS&#xff08…...

FPGA 使用 CLOCK_DEDICATED_ROUTE 约束

使用 CLOCK_DEDICATED_ROUTE 约束 CLOCK_DEDICATED_ROUTE 约束通常在从一个时钟区域中的时钟缓存驱动到另一个时钟区域中的 MMCM 或 PLL 时使 用。默认情况下&#xff0c; CLOCK_DEDICATED_ROUTE 约束设置为 TRUE &#xff0c;并且缓存 /MMCM 或 PLL 对必须布局在相同…...

一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI

一、GenBI AI 代理介绍&#xff08;文末提供下载&#xff09; github地址&#xff1a;https://github.com/Canner/WrenAI 本文信息图片均来源于github作者主页 在 Wren AI&#xff0c;我们的使命是通过生成式商业智能 &#xff08;GenBI&#xff09; 使组织能够无缝访问数据&…...

C动态库的生成与在Python和QT中的调用方法

目录 一、动态库生成 1&#xff09;C语言生成动态库 2&#xff09;c类生成动态库 二、动态库调用 1&#xff09;Python调用DLL 2&#xff09;QT调用DLL 三、存在的一些问题 1&#xff09;python调用封装了类的DLL可能调用不成功 2&#xff09;DLL格式不匹配的问题 四、…...

C++ Primer 自定义数据结构

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作

目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中&#xff0c;同义词&#xff08;Synonym&#xff09;是对数…...

PyTorch框架——基于深度学习YOLOv8神经网络学生课堂行为检测识别系统

基于YOLOv8深度学习的学生课堂行为检测识别系统&#xff0c;其能识别三种学生课堂行为&#xff1a;names: [举手, 读书, 写字] 具体图片见如下&#xff1a; 第一步&#xff1a;YOLOv8介绍 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本…...

深入探索 Vue 3 Markdown 编辑器:高级功能与实现

目录 1. 为什么选择 Markdown 编辑器&#xff1f;2. 选择合适的 Markdown 编辑器3. 安装与基本配置安装 配置 Markdown 编辑器代码说明 4. 高级功能实现4.1 实时预览与双向绑定4.2 插入图片和图像上传安装图像上传插件配置图像上传插件 4.3 数学公式支持安装 KaTeX配置 KaTeX 插…...