标签:
题目说的就是,给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; }
标签:
原文地址:http://www.cnblogs.com/lushichuanshuo/p/4855592.html