無根樹轉有根樹

2021-09-13 12:03:13 字數 810 閱讀 7322

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

樹是一種特殊的圖,因此可以使用鄰接矩陣來表示。如果使用二維陣列來儲存鄰接矩陣,則需要o(n2)個元素的空間,因此改用vector陣列。

從根節點開始對樹進行dfs。遍歷到每個節點時,使用陣列p來儲存該節點的父節點。

注意:狀態轉移時,一定要判斷下乙個狀態(當前狀態的兒子)是否和下乙個狀態的父節點(也就是當前狀態)相等,否則會引起無限遞迴。以上圖為例,當執行dfs(5,1)時,由於儲存樹結構時,節點1亦是5的兒子節點,所以如果不進行判斷,則會發生dfs(1,5),導致迴圈遞迴。
int temp=g[u]

[i];

if(temp!=fa)

#include

#include

#include

#define maxn 105

using namespace std;

vector<

int> g[maxn]

;int p[maxn]

;int n;

void

read_tree()

}void

dfs(

int u,

int fa)}}

intmain()

}return0;

}

無根樹轉有根樹

乙個n n 1000000 個結點的無根樹的各條邊,並指定乙個根結點,要求把樹轉化為有根樹。輸入 結點的數目n,無根樹的各條邊,輸入乙個根結點號。輸出 各個結點的父親編號。執行結果 演算法實現 為方便起見,我們用了stl中的vector來儲存邊,g u 表示u結點的相鄰結點的編號。樹的儲存結構定義 ...

無根樹轉有根樹

1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 10 include 11 define maxn 1000000 10 12 define inf 100000000...

(無根樹轉有根樹)吝嗇的國度

nyoj 吝嗇的國度 20 一道經典的無根樹轉有根樹模板題。模板 include include using namespace std const int maxn 1000 int n,p maxn vectorg maxn 第一種dfs寫法 不需要對對p進行memset void dfs in...