hihocoder-1542-无根树变有根树
hihocoder-1542-无根树变有根树
#1542 : 无根数变有根树
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一棵包含 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。
- 样例输入
-
5 4 1 2 3 1 4 3 5 1
- 样例输出
-
3 1 4 0 1
简单的遍历问题。
/// 1542
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXN = 1000 + 10;
int n, k, dp[MAXN][MAXN], root[MAXN], vis[MAXN];
void dfs(int k){
for(int i=1; i<=n; ++i){
if( vis[i] == 0 && dp[i][k] == 1 ){
root[i] = k;
vis[i] = 1;
dfs(i);
}
}
}
int main(){
int x, y;
while(scanf("%d %d", &n, &k) != EOF){
memset(dp, 0, sizeof(dp));
memset(root, 0, sizeof(root));
memset(vis, 0, sizeof(vis));
for(int i=1; i<n; ++i){
scanf("%d %d", &x, &y);
dp[x][y] = dp[y][x] = 1;
}
vis[k] = 1;
dfs(k);
for(int i=1; i<=n; ++i){
if(i == n){
printf("%d\n", root[i]);
}else{
printf("%d ", root[i]);
}
}
}
return 0;
}

浙公网安备 33010602011771号