11.1.1 无根树转化为有根树
2015-10-05 12:43
302 查看
题目说的就是,给n个节点和n-1条边,然后,你能够把他组成一棵树,然后我现在指定了某个节点,让这个节点成为root,输出以这个节点为根的树中所有节点的父亲节点。
思路:
这道题就是说,我先给你了一个n个节点,n-1条边的树,然后,让你通过对这个树的转化,使得他成为另外一个不破坏边的关系的树。
其实想法很简单,用vector<int>G[max] 来存储这个树,如果用邻接矩阵的话,空间复杂度是O(n^2),而,如果我们vector的话,内存的占用空间与n是线性增加的,
下来就是dfs 的过程了,从某个节点开始,不断的记录这个节点的父亲节点是谁,并保存在f[]中,最后输出f[i]就OK了。
代码:
思路:
这道题就是说,我先给你了一个n个节点,n-1条边的树,然后,让你通过对这个树的转化,使得他成为另外一个不破坏边的关系的树。
其实想法很简单,用vector<int>G[max] 来存储这个树,如果用邻接矩阵的话,空间复杂度是O(n^2),而,如果我们vector的话,内存的占用空间与n是线性增加的,
下来就是dfs 的过程了,从某个节点开始,不断的记录这个节点的父亲节点是谁,并保存在f[]中,最后输出f[i]就OK了。
代码:
# include<cstdio> # include<iostream> # include<vector> using namespace std; # define MAX 1234 vector<int>G[MAX]; int f[MAX]; int n; void dfs( int u,int fa ) { int d = G[u].size(); for ( int i = 0;i < d;i++ ) { int v = G[u][i]; if ( v!=fa ) { dfs(v,f[v] = u); } } } int main(void) { scanf("%d",&n); for ( int i = 0;i < n-1;i++ ) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } int root; scanf("%d",&root); f[root] = -1; dfs(root,-1); for ( int i = 0;i < n;i++ ) printf("%d ",f[i]); return 0; }
相关文章推荐
- 第一章 基础知识
- POJ2155 Matrix二维线段树经典题
- 大话设计模式笔记 命令模式
- POJ2155 Matrix二维线段树经典题
- SSH网上商城(一)---用户注册激活邮件
- VMware12的下载和安装
- 单例的七种写法(二)
- C/C++变量命名规则
- XMPP我写底层协议(零)--废话和准备开幕前
- zend studio 10.6.2 字体大小 设置
- hdu 2686
- /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc 的区别
- 回归分析:单变量线性回归
- 1044. 火星数字(20)
- Operating System: Three Easy Pieces --- Mechanism: Limited Direct Execution (Note)
- 1236 - Pairs Forming LCM (唯一分解定理加组合数学)
- 自定义UITableView每组头部控件
- [线程同步互斥]多线程模型
- 树的子结构
- laravel5如何创建service provider和facade