码迷,mamicode.com
首页 > 其他好文 > 详细

11.1.1 无根树转化为有根树

时间:2015-10-05 14:15:25      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

题目说的就是,给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;
}

  

11.1.1 无根树转化为有根树

标签:

原文地址:http://www.cnblogs.com/lushichuanshuo/p/4855592.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!