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 ≤ ab ≤ 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; 
}

  

原文地址:https://www.cnblogs.com/zhang-yd/p/7373537.html