题目:输入一个n个结点的无根树的各条边,并指定一个根节点,要求把该树转化为有根树,输出各个节点的父亲编号,n≤106n\leq10 ^6n≤106。

可以把无根树看作无向无环且连通的稀疏图,所要做的就是从指定节点开始,深度搜索遍历所有节点,每次遍历等同于从根节点到叶子节点的过程,遍历过程中经过的节点按照先后保存为父亲节点和子节点。

首先读入数据,数据按照每条边的起点和终点输入,可以用邻接表保存,也可以用类似邻接表的二维数组保存,第i行代表以i为起点的边;第i行每个值v代表存在边(u, v)。树的结点数为n时边数为n-1。因为是无向图,每条边只输入一次,但要按照起点-终点,终点-起点保存两次。

测试数据(0, 1), (0, 2), (0, 3), (1, 4), (1, 5), (5, 6), (5, 7)

int n;
vector<vector<int>> tree(1000001);
void read()
{int a, b, i = 0;cout<<"Input number of vertices: ";cin>>n;while(i++ < n-1 && cin >> a && cin >> b) //分别输入n-1条边的起点和终点{tree[a]. push_back(b);tree[b]. push_back(a);}tree.shrink_to_fit(); //去掉不必要空间
}

接下来使用深度搜索遍历树,从根结点开始,找到每个与它相邻的点,找到以后将这个相邻点的父亲设为根节点,再用相同的方法将每个相邻结点作为根节点继续遍历。由于每条边存在两次(u-v, v-u),可能已经设定u的父亲节点是v,当对v搜索时,搜索到相邻点u不能再将u的父亲设为v,否则会引起无限递归。因此需要判断if(v != u的父亲节点)。

int n;
vector<vector<int>> tree(1000001);
vector<int> p(1000001, -1);void dfs(int current) //current为当前根节点
{for(int i = 0; i < tree[current].size(); i++){if(tree[current][i] != p[current]){p[tree[current][i]] = current;dfs(tree[current][i]);}}p.shrink_to_fit();
}

完整代码及主函数:

#include<vector>
#include<iostream>
using namespace std;int n;
vector<vector<int>> tree(1000001);
vector<int> p(1000001, -1);void read()
{int a, b, i = 0;cout<<"Input number of vertices: ";cin>>n;while(i++ < n-1 && cin >> a && cin >> b){tree[a]. push_back(b);tree[b]. push_back(a);}tree.shrink_to_fit();
}void dfs(int current)
{for(int i = 0; i < tree[current].size(); i++){if(tree[current][i] != p[current]){p[tree[current][i]] = current;dfs(tree[current][i]);}}p.shrink_to_fit();
}int main()
{read();int root;cout<<"Input root number: ";cin>>root;dfs(root);for(int i = 0; i < n; i++){if(p[i] == -1) cout << "Root is " << i << endl;else cout << "the parent of " << i << " is " << p[i] << endl;}}

结果:

算法竞赛入门经典第11章 无根树转有根树相关推荐

  1. 算法竞赛入门经典第3章

    3.1数组 数组较大 比较大的数组尽量声明在main函数外,否则程序可能无法进行. 数组操作 如果要从数组a复制k个元素到数组b,可以这样做:memcpy(b,a,sizeof(int)*k).  如 ...

  2. 《算法竞赛入门经典》 第二章 循环结构程序设计 习题

    注:这里为了便于测试,直接使用stdin,stdout进行输出,没有进行文件读写操作. 习题2-1 位数(digit) 输入一个不超过10^9的正整数,输出它的位数.例如12735的位数是5.请不要使 ...

  3. 《算法竞赛入门经典》第一章习题答案

    习题1-1 平均数(average) 输入3个整数,输出它们的平均值,保留3位小数. #include <stdio.h> int main() { int a,b,c; scanf(&q ...

  4. 《算法竞赛入门经典》第一章1.5

    1.5.4 问题1 问题2 问题3 问题4 问题5  最邻近的else 转载于:https://www.cnblogs.com/LzKlyhPorter/p/4185828.html

  5. 算法竞赛入门经典 第七章 总结

    目录: 7.1 简单枚举 7.2 枚举排列 7.3 子集生成 7.1 简单枚举 例题7-1 除法(Division, UVa 725) 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij ...

  6. 算法竞赛入门经典 第五章总结1

    例题1: 输入多行数据,每行包含若干个以空格隔开的整数,输出每行中所有整数之和 #include<iostream> #include<string> #include< ...

  7. 算法竞赛入门经典第六章(例题) B - Rails(涉及到栈的运用)

    题目:B - Rails 原题链接:https://cn.vjudge.net/contest...: 题目大意:先输入一个表示火车的节数,火车原本是按从1到n的顺序,但是一起进的还是分开进的是不一定 ...

  8. 刘汝佳算法竞赛入门经典第三章习题

    /*给出一些容易理解的解题方法  但是没有oj评测 所以无法保证一定正确  矩阵的旋转给出了左旋和右旋 不确定题目3-5是哪一种*/ 习题3-1分数统计(stat) 输入一些学生的分数,哪个分数出现的 ...

  9. 算法竞赛入门经典第4章 【uvaoj习题(一)】

    题目合集 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=94 uva100 ...

  10. 算法竞赛入门经典(第二版)第三章习题

    声明:作者水平有限,只是会基础C语言的小菜,C++还未入门.作者仅根据算法竞赛入门经典(第二版)书上第三章习题所述题意而编写,并未严格按照原题的输入输出编写,代码仅经过个人测试(OJ网站太慢了).代码 ...

最新文章

  1. 个人信息泄露致电信诈骗猖獗 专家:治理亟须完善立法
  2. web服务器与网页表单通信,前端与后端通信的几种方式
  3. java android下载文件_Android 下载文件(jsp做的服务器上)下载下来和源文件大小不一...
  4. 【转贴】Decoda Tutorial LUA调式器
  5. javaweb学习总结(二十二):基于Servlet+JSP+JavaBean开发模式的用户登录注册
  6. 面试题:如何设计一个高并发的系统?
  7. 【转】缺陷与出路—一个游戏开发者的反思
  8. 推荐一款优秀的注册表和临时文件等清理软件-CCleaner
  9. 举例 微积分 拉格朗日方程_理解微积分真谛:微分方程
  10. php中的接口 interface 和实现 implement
  11. linux虚拟机内存不够,解决linux虚拟内存不够用的方法
  12. [AMV-GCNs Neurocomputing2021] Adaptive multi-view graph convolutional networks for skeleton-based ac
  13. 配置网络拓扑图测试软件,网络工程师必备系列课程专题(数据恢复+RAID配置+画拓扑图)...
  14. 多 UI 版本网页五子棋实现
  15. 大数据就业方向_学大数据就业前景如何,就业方向有哪些?
  16. 三、jQuery 中的 DOM 操作(超详细)
  17. 二叉树的层序遍历-Java
  18. 电商平台是如何赚钱的?
  19. DBA_DATAPUMP_JOBS
  20. 提高孩子睡眠质量 学业事半功倍

热门文章

  1. 幼儿园调查过程怎么写_(完整版)幼儿园调查报告
  2. 一元多次方程C语言,C语言解决多元多次方程.(19页)-原创力文档
  3. ssrf dict MySQL_SSRF之利用dict和gopher吊打Redis
  4. Scala实现Kafka生产者与消费者实例
  5. oracle取得组内行号,行号
  6. 谷歌邮箱服务器该怎么填,谷歌游戏怎么写 谷歌邮箱格式_游侠手游
  7. Choerodon猪齿鱼实践之持续交付流水线
  8. 永久关闭windows的自动更新
  9. python你好世界_你好,世界! Python方式
  10. 嗖嗖移动大厅之使用场景类