ACM:樹的變換,無根樹轉有根樹
阿新 • • 發佈:2019-01-11
題目:
輸入一個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; }