在不少题目中会遇到这样一类题:无向连通图 G 有 n 个点,n-1 条边。点从 1 到 n 依次编号.......很明显是个树结构,但是不知道具体的父子关系,这时需要将一棵无根树转化成有根树,具体讲解如下:
1.树的存储:若点数较大,需要用vector存储
vector<int> G[maxn]; void read_tree(){ int u,v; scanf("%d",&N); for(i=1;i<=N-1;i++){ scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } }
2.转化:转化是由一个dfs完成的,在递归中填补fa[]
void dfs(int u,int father){//确定以u为根的树,father是u的父亲 int d=G[u].size(); for(int i=0;i<d;i++){ int v=G[u][i]; if(v!=father) //防止倒着再搜回去,进入死循环 dfs(v,fa[v]=u); //递归+赋值 } }
3.小细节:初始化的时候令fa[root]=-1,意思是root没有父亲,调用的是dfs(root,-1)
时间: 2024-10-19 20:06:01