算法分析:所谓无根树,就是根节点任意的树。我们可以给它确定一个根节点。
我们可以假定认为某一个节点为根节点,然后从该节点开始进行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); }