#1542 : 无根数变有根树

时间限制: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 <bits/stdc++.h>
using namespace std;
int n, k, x, y;
vector<int>v[1010];
int fa[1010];
void dfs(int f, int k) {

    for (int i = 0; i < v[k].size(); ++i) {
        int x = v[k][i];
        if (x == f) continue;
        fa[x] = k;
        dfs(k , x);
    }
}
int main() {
    cin>>n>>k;
    for (int i = 1; i < n; ++i) {
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    memset(fa, 0 ,sizeof fa);
    dfs(-1, k);
    for (int i = 1; i <= n; ++i) {
        printf("%d%c",fa[i], i == n ? 10 : ' ');
    }
    return 0;
}
原文地址:https://www.cnblogs.com/pk28/p/7259747.html