** 2171 - 树的高度(2) --- 深搜求树的高度及父子关系
** 来源:东方博宜oj oj.czos.cn
*解法一:递归求解,传递2个参数 dfs(int x,int f);
#include<bits/stdc++.h>
using namespace std;
const int N=30;
int n,x,y;
int fa[N],a[N][N],dep[N];
// 深搜求:每个节点的父节点编号,深度
void dfs(int x,int f) // f:父节点
{
fa[x]=f; // 标记父
dep[x]=dep[f]+1; // 求深度
// 讨论x点能去的点
for(int i=1;i<=n;i++)
{
// 有边&&要去的点不是父节点
if(a[x][i]==1&&i!=f) dfs(i,x);
}
}
int main()
{
cin>>n;
int x,y;
for(int i=1;i<=n-1;i++)
{
cin>>x>>y;
a[x][y]=1;
a[y][x]=1;
}
dfs(1,0);
//输出结果
for(int i=2;i<=n;i++) cout<< i<< " "<< fa[i]<< " "<< dep[i]<<endl;
return 0;
}
*解法二:递归求解,传递1个参数 dfs(int x);
#include<bits/stdc++.h>
using namespace std;
const int N=30;
int fa[N],a[N][N],dep[N];
int n;
// 深搜求:每个节点的父节点编号,深度
void dfs(int x)
{
// 讨论x能去的点
for(int i=1;i<=n;i++)
{
// 有边&&要去的点不是父节点
if(a[x][i]==1&&i!=fa[x])
{
//i的父是x
fa[i]=x;
dep[i]=dep[x]+1;
dfs(i);
}
}
}
int main()
{
cin>>n;
int x,y;
for(int i=1;i<=n-1;i++)
{
cin>>x>>y;
a[x][y]=1;
a[y][x]=1;
}
dep[1]=1; //初始化
dfs(1);
//输出结果
for(int i=2;i<=n;i++) cout<< i<< " "<< fa[i]<< " "<< dep[i]<<endl;
return 0;
}
*解法三:邻接矩阵(vector数组存储)求解
#include<bits/stdc++.h>
using namespace std;
const int N=30;
vector<int> a[N];
int n;
int fa[N],dep[N];
void dfs(int x,int f)
{
fa[x]=f;
dep[x]=dep[f]+1;
// 遍历每个点能去的点
for(int i=0;i<a[x].size();i++)
{
// 要去的点不是父
if(a[x][i]!=f) dfs(a[x][i],x);
}
}
int main()
{
cin>>n;
int x,y;
// n个点,n-1条边
for(int i=1;i<=n-1;i++)
{
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
//求每个节点的父,深度
dfs(1,0);
// 输出2~n个节点的父和深度
for(int i=2;i<=n;i++) cout<< i<< " "<< fa[i]<< " "<< dep[i]<<endl;
return 0;
}
*解法四:邻接表(结构体数组)存储
#include<bits/stdc++.h>
using namespace std;
const int N=30;
int pre[N];
int k,n;
struct node
{
int from,to,next;
}a[N*2];
int fa[N],dep[N];
void add(int u,int v)
{
k++;
a[k].from=u;
a[k].to=v;
a[k].next=pre[u];
pre[u]=k;
}
void dfs(int x,int f)
{
fa[x]=f;
dep[x]=dep[f]+1;
// 访问x能到的点
for(int i=pre[x];i!=0;i=a[i].next)
{
// 要去的点不是父元素
if(a[i].to!=f) dfs(a[i].to,x);
}
}
int main()
{
cin>>n;
int x,y;
for(int i=1;i<=n-1;i++)
{
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
for(int i=2;i<=n;i++) cout<< i<< " "<< fa[i]<< " "<< dep[i]<< endl;
return 0;
}
*解法五:邻接表(一维数组存储)求解
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int pre[N],to[N*2],ne[N*2],k;
int fa[N];
int n;
int x,y,d[N]; // d[]:表示每个节点的深度
void add(int u,int v)
{
++k;
to[k]=v;
ne[k]=pre[u];
pre[u]=k;
}
void dfs(int x,int f)
{
fa[x]=f;
d[x]=d[f]+1;
for(int i=pre[x];i!=0;i=ne[i])
{
if(to[i]!=f) dfs(to[i],x);
}
}
int main()
{
cin>>n;
int x,y;
for(int i=1;i<=n-1;i++)
{
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
for(int i=2;i<=n;i++) cout<< i<< " "<< fa[i]<< " "<< d[i]<<endl;
return 0;
}