DFS无根树转有根树
作者:互联网
dfs无根树转有根树算法
无根树使用邻接表来表示,但是树不联通,无环
所以可以根据指定的一个顶点,来建立一颗树,树是使用父亲数组形式来表示的
无根树 : 根节点任意的树
father数组: 用于记录当前节点的父亲节点.
注意两点
- father[root] = -1 表示根无父亲节点
- bfs或dfs过程中 判断遇到的点是不是根节点,若非,则进行父节点的指定,如果是根节点则不修改,如果修改了根节点会引起无限递归或者无限循环
我们自行给其确定一个根节点,然后从该节点开始,进行bfs或dfs搜索,在搜索过程中,就像记录路径一样记录一个father数组,
总结:
1·使用链式前向星or 邻接矩阵的方式确定图
2·设置根节点为-1 并从root节点开始遍历
3·遍历每个相邻节点v,并且判断相邻节点的父亲fa和当前节点的父亲是否相同 若不同则将当前节点v 的父亲设置为 u
#include<bits/stdc++.h>
using namespace std;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 50;
int fa[50];
vector<int> g[N];
void dfs(int u,int father){
int len = g[u].size();
for(int i = 0;i < len; i++){
int v = g[u][i];
if(v != father){
dfs(v,fa[v] = u);
}
}
}
int main(int argc, char *argv[]) {
SIS;
int n;
int root;
cin >> root;
cin >> n;
for(int i = 0;i < n - 1;i++){
int u,v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
fa[root] = -1;
dfs(root, -1);
for(int i =0 ;i < n; i++){
cout << fa[i] << endl;
}
return 0;
}
标签:int,father,dfs,DFS,根树,无根树,root,节点 来源: https://www.cnblogs.com/Hwangs/p/12357226.html