无根树转为有根数模板

算法分析:所谓无根树,就是根节点任意的树。我们可以给它确定一个根节点。

   我们可以假定认为某一个节点为根节点,然后从该节点开始进行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);
}

猜你喜欢

转载自www.cnblogs.com/033000-/p/10033912.html
今日推荐