nyoj 20 转换根节点

来源:互联网 发布:算法书籍 哪本好 编辑:程序博客网 时间:2024/06/05 08:22

思想:通过一个dfs,以递归的思想搜索当前建树节点的父节点,直到找到最后的根节点,每个过程中把父节点倒置,然后把根节点的父节点置为所要求的节点,然后根据当时所存的父节点,一个一个输出

#include <stdio.h>#include <string.h>#define MAX 100001int fa[MAX];//代表问题解,即从S到达第 i个城市必须经过的前一个城市void dfs(int cur){    int t=fa[cur];    if(t) //若到达叶节点,则终止递归,将路径上的子节点与父节点交换,保证cur为根(无父节点)    {        dfs(t);        fa[t]=cur;    }}int main(){    int M,N,S,a,b,i;    scanf("%d",&M);    while(M--)    {        scanf("%d%d",&N,&S);        memset(fa,0,sizeof(fa));        for(i=1; i<N; i++)        {            scanf("%d%d",&a,&b);            if(fa[b]==0) //若当前b无父节点,则使a为b父节点            {                fa[b]=a;            }            else            {                dfs(a);//保证a无父节点                fa[a]=b;//使a的父节点为b            }        }        dfs(S);//调整成以S为根的树        fa[S]=-1;//满足题目要求,省去特判        for(i=1; i<=N; i++)        printf("%d ",fa[i]);        printf("\n");    }    return 0;}
0 0