Fix a Tree(树的遍历,判断是否有环 并连成一颗树 )

news2025/3/13 11:20:01

题意翻译

对于下图中的树,

图1

可以用数组表示为 [2,3,3,2]。这种可以表示树的数组(即有效)需要符合以下条件:

  1. 有且只有一个索引 r ,符合pr​=r 。其中顶点 r 是树的根。
  2. 对于所有剩下的 n−1 个顶点 i 一定要有在 i 和 pi​ 之间的边。

比如 数列 (1,2,2)、(2,3,1) 和 (2,1,3) 都是因为的数目而导致不有效

现在给你一个数组 a1​,a2​,⋯,an​,不一定有效的。你需要对数组里面的值,通过最小次数更改,使得这个数组有效

并输出最小更改次数和一个通过最小更改次数而更改成功的有效数组

如果有多种解,只需说出任何一组。

输入格式

第一行是一个整数 n (2≤n≤200000) ----树的顶点个数。

第二行包含 n 个整数 (1≤ai​≤n。

输出格式

第一行一个整数,最小更改次数

第二行输出任意一个通过最小更改次数而更改成功的有效数组。

说明

  • 第一个样例只需要改一个就好啦!第一个样例输出是一个扎根于顶点 44 的树(因为 p4​=4),你可以在下面的图中看到。另一个正确的答案应该是数列 2,3,3,2,扎根在顶点 3,也可以在下面的图中看到。两个图中顶点将用红色标出。

图2

  • 第二个样例中,给出的数列已经是有效的了。

输入输出样例

输入 #1复制

4
2 3 3 4

输出 #1复制

1
2 3 4 4 

输入 #2复制

5
3 2 2 5 3

输出 #2复制

0
3 2 2 5 3 

输入 #3复制

8
2 3 5 4 1 6 6 7

输出 #3复制

2
2 3 7 8 1 6 6 7

说明/提示

In the first sample, it's enough to change one element. In the provided output, a sequence represents a tree rooted in a vertex 4 (because p4​=4 ), which you can see on the left drawing below. One of other correct solutions would be a sequence 2 3 3 2, representing a tree rooted in vertex 3 (right drawing below). On both drawings, roots are painted red.

In the second sample, the given sequence is already valid.

解析:

本题的题意:

给定一些连接的点,可以时有环的,也可以是没有环的。将他们全部合成一颗树,树根只有一个。

我们考虑,确定一个为树根,将自环的一个节点,连接到给定的根节点上,这样子就解环了。

修改的次数可以复制一个数组和原数组做对比。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

long long n,a[2000010],f[2000010],vis[2000010],root =0,tot=0,ans;

void dfs(long long u){
    if(vis[u]) return;
    vis[u]=tot;
    if(f[u]==u){
        if(!root) root=u;//如果本来没有root它自己就当root
        else{
            f[u]=root;
        }
        return;
    } 
    if(vis[f[u]]){
        if(vis[f[u]]==tot){//是环
            if(!root){
                f[u]=u;// 把u设为根
                root=f[u];
            }
            else{
                f[u]=root; //当前点连接到 设定的根节点 
            }   
        }
        return;
    }
    dfs(f[u]);
}

int main(){
    long long i,j,u,v;
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>a[i];
    }
    memcpy(f,a,sizeof(a));
    for(i=1;i<=n;i++){//提前找root
        if(f[i]==i){
            root=i;
            break;
        }
    }
    for(i=1;i<=n;i++){
        tot++;//这是一个细节坑点:有可能你之前访问过树的一部分(不是环),所以每次dfs都要打不同的标记
        dfs(i);
    }
    for(i=1;i<=n;i++){
        if(f[i]!=a[i]) ans++;//最后统计答案
    }
    cout<<ans<<endl;
    for(i=1;i<=n;i++){
        cout<<f[i]<<" ";
    }
    cout<<endl;
    return 0;
}

时间复杂度为:O(n);

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

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

相关文章

怎么制作自己的微信小程序店铺?

移动互联网的迅猛发展&#xff0c;微信小程序已成为商家拓展线上业务的重要工具。它不仅能够提供便捷的用户访问体验&#xff0c;还能够帮助商家快速构建起一个功能齐全的在线商城。那么&#xff0c;商家怎么制作自己的微信小程序店铺&#xff1f; 一、准备工作&#xff1a; …

鸿蒙 Harmony 初体验

前言 看现在网上传得沸沸扬扬的鸿蒙&#xff0c;打算弄个 hello world 玩一下, 不然就跟不上时代的发展了 环境安装 我的环境 Windows 11 家庭中文版HarmonyOS SDK (API 9)DevEco Studio (3.1.1 Release)Node.js (16.19.1) 开发IDE下载 官方下载链接 配置 nodejs 这里帮…

MWC 2024|「Paraverse平行云」展示空间计算时代沉浸式交互体验

&#x1f389;当地时间2月26日&#xff0c;2024年世界移动通信大会&#xff08;MWC2024&#xff09;在巴塞罗那拉开帷幕。作为全球移动通信领域最大的技术展会之一&#xff0c;MWC被视为全球通信行业风向标。 &#x1f680;随着Vision Pro再次点燃全球空间计算技术热情&#xf…

电脑文件msvcr100.dll丢失的多种解决方法,快速修复dll报错问题

当计算机用户遇到“msvcr100.dll丢失”的问题时&#xff0c;可能会感到困扰并急于寻求解决方案。这个提示通常意味着系统中某个关键的动态链接库文件缺失&#xff0c;这可能导致某些应用程序无法正常启动或运行。msvcr100.dll是Microsoft Visual C Redistributable Package的一…

HarmonyOS应用开发-Stage模型开发概述

基本概念 UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。提供了应用UI开发所必需的能力&#xff1a;多种组件、布局计算、动画能力、UI交互、绘制。 方舟开发框架针对开发者提供了两种开发范式&#xff1a; 基于ArkTS…

Java实现知乎热点小时榜爬虫

1.效果演示 1.1 热点问题列表 启动程序后&#xff0c;自动展示热点问题&#xff0c;并等待终端输入 1.2 根据序号选择想看的热点问题 输入问题序号&#xff0c;展示回答内容 1.3 退出 输入q即可退出程序 2.源码 2.1 pom.xml <?xml version"1.0" enco…

【机器学习】无监督学习算法之:层次聚类

层次聚类 1、引言2、层次聚类2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 这周末过的滋润啊。 小鱼&#xff1a;… 每个周末都挺滋润的啊。 小屌丝&#xff1a;啊~ ~ 你这… 小鱼&#xff1a;周末加班&#xf…

从大厂到高校,鸿蒙人才“红透半边天”!

截至目前&#xff0c;继清华大学、北京航空航天大学、武汉大学等985高校开设鸿蒙相关课程后&#xff0c;已经或将要开设鸿蒙相关课程的985、211高校达到近百所&#xff0c;为鸿蒙人才培养提供沃土。 随着鸿蒙系统即将摒弃安卓&#xff0c;鸿蒙原生应用将全面启动的背景下&…

win10从Huggingface下载模型

这里写自定义目录标题 安装CLI工具设置环境变量下载 安装CLI工具 安装Huggingface CLI pip install -U huggingface_hub设置环境变量 设置好变量后&#xff0c;重新启动一个新的命令窗口&#xff0c;cmd或者powershell 下载 huggingface-cli download --resume-download fa…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的安全帽检测系统(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;开发先进的安全帽识别系统对提升工作场所的安全性至关重要。本文详细介绍了使用深度学习技术创建此类系统的方法&#xff0c;并分享了完整的实现代码。系统采用了强大的YOLOv8算法&#xff0c;并对其与YOLOv7、YOLOv6、YOLOv5的性能进行了详细比较&#xff0c;…

mysql数据库:使用 bash脚本 + 定时任务 自动备份数据

mysql数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏…

pytorch(十)循环神经网络

文章目录 卷积神经网络与循环神经网络的区别RNN cell结构构造RNN例子 seq2seq 卷积神经网络与循环神经网络的区别 卷积神经网络&#xff1a;在卷积神经网络中&#xff0c;全连接层的参数占比是最多的。 卷积神经网络主要用语处理图像、语音等空间数据&#xff0c;它的特点是局部…

【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值

作者推荐 视频算法专题 本文涉及知识点 分类讨论 解析几何 LeetCode1330. 翻转子数组得到最大的数组值 给你一个整数数组 nums 。「数组值」定义为所有满足 0 < i < nums.length-1 的 |nums[i]-nums[i1]| 的和。 你可以选择给定数组的任意子数组&#xff0c;并将该子…

3月15日ACwing每日一题

789. 数的范围 - AcWing题库 #include <bits/stdc.h> using namespace std; int n,q; const int N100007; int a[N]; void solve(){//lower_bound是大于等于 upper_bound是大于int num;cin>>num;if(lower_bound(a,an,num)!an&&*lower_bound(a,an,num)num)…

fs模块 之 文件读取

fs 文件读取&#xff1a; 利用文件读取而不是直接打开文本查看的目的是为了实现自动化 读取文件的应用场景:电脑开机/程序运行/播放视频音乐/上传文件... 一、异步读取 &#xff08;1&#xff09;语法&#xff1a;fs.readFile(path,[options],callback); 以之前写的文件写…

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…

红队笔记7--Web机器为Linuxdocker逃逸

其实&#xff0c;不知道大家有没有想过&#xff0c;我们之前练习的都是web机器是windows的版本&#xff0c;但是其实&#xff0c;在现实生活中&#xff0c;服务器一般都是Linux的版本&#xff0c;根本不可能用到windows的版本 那么如果是Linux的话&#xff0c;我们就有很多的困…

express+mysql+vue,从零搭建一个商城管理系统14--快递查询(对接快递鸟)

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、安装md5&#xff0c;axios&#xff0c;qs二、新建config/logistics.js三、修改routes/order.js四、添加商品到购物车总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service部分 快递鸟…

隐藏深的bug发现不了 ,有点挫备感 ,那是你没有进行bug总结 。

1.bug总结的意义 作为功能测试人员来说&#xff0c;可能有一半的时间都花在了和bug打交道上&#xff0c;比如如何发现bug &#xff0c;提交bug &#xff0c;跟踪bug以及回归bug上 。作为测试人员最重要的成果的bug &#xff0c;我们往往更看重的是它的数量 &#xff0c;却很少…

Android 辅助功能 -抢红包(三)

Android 辅助功能 -抢红包(三) 本篇文章继续讲述辅助功能. 主要通过监听通知栏红包消息,来跳转聊天页面,并自动回复对方"谢谢". 上篇文章我们讲述了监听notification, 跳转聊天界面. 具体可查看: Android 辅助功能 -抢红包(二) 1: 使用monitor抓取id. 打开andro…