- 樣例輸入
-
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;
}