您的位置:首页 > 其它

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了。

代码:

# 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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: