hihoOffer收割练习20题目1

题目1 : 无根数变有根树

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一棵包含 N 个节点的无根树,小Hi想知道如果指定其中某个节点 K 为根,那么每个节点的父节点是谁?

输入

第一行包含一个整数 N 和 K。1 ≤ N ≤ 1000, 1 ≤ K ≤ N。    

以下N-1行每行包含两个整数 a 和 b,代表ab之间存在一条边。 1 ≤ ab ≤ N。  

输入保证是一棵树。

输出

输出一行包含 N 个整数,分别代表1~N的父节点的编号。对于 K 的父节点输出0。

样例输入
5 4  
1 2  
3 1  
4 3  
5 1
样例输出
3 1 4 0 1

代码如下:

#include <iostream>
#include <vector>
using namespace std;

const int MAXN = 1005;
int n, p[MAXN];
vector<int> G[MAXN];

void dfs(int u, int fa) {   //递归转化为以u为根的子树,u的父亲为fa
	int d = G[u].size();        //节点u的相邻点的个数
	for(int i = 0; i < d; ++i) {    //循环遍历跟这个节点相连接的d个节点。
		int v = G[u][i];       //节点u的第i个相邻点v
		if(fa != v) dfs(v, p[v] = u);  //把v的父亲节点设为u,然后递归转化为以v为根的子树
		//一定要判断v是否和其父亲节点相等!
	}
}

int main() {
    int root;
	//cin >> root;
	cin >> n>>root;
	for(int i = 1; i <= n-1; i++) {   //输入n-1条边
		int u, v;
		cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	  //指定根节点。
	p[root] = 0;   //设定根节点的父亲节点为-1,代表根节点没有父亲节点。
	dfs(root, 0);
	for(int i = 1; i <= n; ++i) {
		cout << p[i] <<" ";
	}
	return 0;
}





















































原文地址:https://www.cnblogs.com/bryce1010/p/9387448.html