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;
}

猜你喜欢

转载自www.cnblogs.com/Hwangs/p/12357226.html
今日推荐