时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
5 4 1 2 3 1 4 3 5 1
样例输出
-
3 1 4 0 1
描述
给定一棵包含 N 个节点的无根树,小Hi想知道如果指定其中某个节点 K 为根,那么每个节点的父节点是谁?
输入
第一行包含一个整数 N 和 K。1 ≤ N ≤ 1000, 1 ≤ K ≤ N。
以下N-1行每行包含两个整数 a 和 b,代表ab之间存在一条边。 1 ≤ a, b ≤ N。
输入保证是一棵树。
输出
输出一行包含 N 个整数,分别代表1~N的父节点的编号。对于 K 的父节点输出0。
思路:
建图后从给定的节点K开始dfs,dfs过程中记录parent节点即可
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 1005;
vector<int>G[maxn];
bool vis[maxn];
int parent[maxn];
void dfs(int v) {
vis[v] = 1;
for (int i = 0; i < G[v].size(); ++i) {
auto u = G[v][i];
if (!vis[u]) {
dfs(u);
parent[u] = v;
}
}
}
void solve(int &N, int &K) {
int u,v;
memset(vis, 0, sizeof(vis));
memset(parent, 0, sizeof(parent));
for (int i = 0; i < N-1; ++i) {
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
parent[K] = 0;
dfs(K);
for (int i = 1; i <= N; ++i) {
cout << parent[i] << " ";
}
}
int main() {
int N, K;
cin >> N >> K;
solve(N, K);
return 0;
}