1. 程式人生 > >ACM:樹的變換,無根樹轉有根樹

ACM:樹的變換,無根樹轉有根樹

題目:

輸入一個n個節點的無根樹的各條邊,並指定一個根節點,要求把該樹轉化為有根樹,輸出各個節點的父親編號。

分析:分析在程式碼的註釋中!


#include <iostream>
#include <vector>
using namespace std;

const int MAXN = 1000;
int n, p[MAXN];
vector<int> G[MAXN];

void dfs(int u, int fa) {   //遞迴轉化為以u為根的子樹,u的父親為fa
	int d = G[u].size();        //節點u的相鄰點的個數
	for(int i = 0; i < d; ++i) {    //迴圈遍歷跟這個節點相連線的d個節點。
		int v = G[u][i];       //節點u的第i個相鄰點v
		if(fa != v) dfs(v, p[v] = u);  //把v的父親節點設為u,然後遞迴轉化為以v為根的子樹
		//一定要判斷v是否和其父親節點相等!
	}
}

int main() {
	cin >> n;
	for(int i = 0; i < n-1; i++) {   //輸入n-1條邊
		int u, v;
		cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	int root;   
	cin >> root;    //指定根節點。
	p[root] = -1;   //設定根節點的父親節點為-1,代表根節點沒有父親節點。
	dfs(root, -1);
	for(int i = 0; i < n; ++i) {
		cout << p[i] << endl;
	}
	return 0;
}