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 ", root[i]); }else{ printf("%d ", root[i]); } } } return 0; }