1. 程式人生 > >無根樹轉為有根數模板

無根樹轉為有根數模板

演算法分析:所謂無根樹,就是根節點任意的樹。我們可以給它確定一個根節點。

   我們可以假定認為某一個節點為根節點,然後從該節點開始進行dfs或者bfs搜尋,    在搜尋的過程中,就像記錄路徑那樣記錄一個father[]陣列,用來記錄當前節點的    父親節點。演算法很簡單,需要注意兩個地方:    (*1.設定根節點father[root]=-1; 表示根節點沒有父節點    (*2.bfs或dfs的搜尋過程中,判斷遇到的點是不是根節點,不是的話就進行父節點的
   指定。如果是根節點的話,千萬不要修改,如果忘記判斷這個條件,將引起無限遞迴(dfs)    或者無限迴圈(bfs)
const int maxn=1e6+5;
int n,father[maxn];
vector<int> G[maxn];
void dfs(int u,int f){
    int len=G[u].size();
    for(int i=0;i<len;i++){
        int v=G[u][i];
        if(v!=f) dfs(v,father[v]=u);
    }
}
void read_tree(){ scanf("%d",&n); int u,v; for(int i=0;i<n-1;i++){ scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } } int main(){ read_tree(); father[0]=-1; dfs(0,-1); }