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

题意翻译

对于下图中的树,

图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它自己就当rootelse{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++){//提前找rootif(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.hqwc.cn/news/540948.html

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

相关文章

浏览器同源策略及跨域问题

同源策略&#xff1a;同源策略是一个重要的安全策略&#xff0c;它用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介。 同源策略的作用&#xff1a;保护浏览器中网站的安全&#xff0c;限制ajax只…

【从零开始构建GPT模型】(四)Linux篇:基于Linux内核的Ubuntu系统安装教程

目录 附&#xff1a;所需工具 一、安装包下载 1、下载安装包 2、注册账户 二、与Windows系统共存安装 1、制作系统启动U盘 2、进入安装界面 3、享受Ubuntu 注&#xff1a;本人为保险起见&#xff0c;并未安装Ubuntu系统&#xff0c;因要待新买一块硬盘之后&#xff0c;将…

深入了解 Spring boot的事务管理机制:掌握 Spring 事务的几种传播行为、隔离级别和回滚机制,理解 AOP 在事务管理中的应用

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

发票OCR-国税可进行的发票查验种类-接口文档

发票查验内容包括发票种类名称、发票代码、发票号码、金额、销售方名称、购买方名称等信息。可以在国家税务总局全国增值税发票查验平台上进行查验&#xff0c;也可以进入发票所属省、直辖市税务局官方网站的“我要查询-发票查询”模块进行查验&#xff0c;企业也可以通过发…

Nacos2.3.1集群部署

Nacos集群部署 1、下载安装包 https://github.com/alibaba/nacos/releases/download/2.3.1/nacos-server-2.3.1.tar.gz2、解压安装包 tar -xf nacos-server-2.3.1.tar.gz3、java环境配置 3.1、下载jdk17 https://download.oracle.com/java/17/archive/jdk-17.0.10_linux-x64…

Vue3自定义指令!!!

通过自定义指令实现菜单显示和权限控制问题。 一、新建一个在src目录下创建包directives&#xff0c;在包中创建一个ts文件。 import { useStore } from "/store/pinia";function hasRoles(role: any) {const pinaRoles useStore().roles;if (typeof role "s…

java枚举与模拟方法

枚举 枚举的定义 枚举算法&#xff08;穷举算法&#xff09;&#xff0c;这种算法就是在解决实际问题的时候去使用所有的方式去解决这个问题&#xff0c;会通过推理去考虑事件发生的每一种可能性&#xff0c;最后推导出结果 优点 简单粗暴&#xff0c;他暴力的枚举所有可能&…

【数据可视化】Echarts最常用图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 准备工作3. 柱状图3.1 绘制堆积柱状图3.2 绘制标准条形图3.3 绘制瀑布图 4. 折线图4.1 绘制堆积面积图和堆积折线图4.2 绘制阶梯图 5. 饼图5.1 绘制标准饼图5.2 绘制圆环图5.2 绘制嵌套饼图5.3 绘制南丁格尔…

对称加密算法(DES、AES)

加密密钥 解密密钥 DES现在基本不再使用 3DES处理速度慢 AES通常用于移动通信系统加密以及基于SSH协议的软件

Python解释器安装

下载Python解释器 如果您从未安装过Python解释器&#xff0c;那么在编写Python代码前需要安装该解释器。什么是Python解释器呢&#xff1f; “Python解释器”就像是一个能够理解和执行Python编程语言的“翻译官”。你写的Python代码&#xff08;一系列指令&#xff09;需要有一…

【SVG】前端-不依靠第三方包怎么画连线???

如何用SVG实现连线功能 在Web开发中&#xff0c;我们经常会遇到需要在页面上绘制图形或者实现一些图形交互的场景。SVG&#xff08;Scalable Vector Graphics&#xff09;作为一种用于描述二维图形的XML标记语言&#xff0c;在这方面提供了极大的便利。本文将以一个具体的例子…

HTML案例-1.标签练习

效果 源码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…