可以使用深度优先搜索(DFS)来解决这个问题。首先,创建一个数组来保存每个节点的父亲节点。然后,从任意一个节点开始进行DFS遍历,遍历过程中更新每个节点的父亲节点。

具体步骤如下:

  1. 创建一个大小为n的整型数组parent,初始化所有元素为-1,表示所有节点都没有父亲节点。
  2. 选择一个起始节点start,将其父亲节点设置为自己,即parent[start] = start。
  3. 对于start的每个邻接节点v,如果v的父亲节点为-1,即v还没有被访问过,那么将v的父亲节点设置为start,即parent[v] = start,并对v进行DFS遍历。
  4. 返回parent数组作为结果。

以下是用C++实现的代码:

#include <iostream>
#include <vector>

using namespace std;

void dfs(vector<vector<int>>& graph, vector<int>& parent, int node) {
    for (int i = 0; i < graph[node].size(); i++) {
        int neighbor = graph[node][i];
        if (parent[neighbor] == -1) {
            parent[neighbor] = node;
            dfs(graph, parent, neighbor);
        }
    }
}

vector<int> findParents(vector<vector<int>>& graph) {
    int n = graph.size();
    vector<int> parent(n, -1);
    int start = 0;  // 选择一个起始节点
    parent[start] = start;
    dfs(graph, parent, start);
    return parent;
}

int main() {
    int n = 5;
    vector<vector<int>> graph(n);
    graph[0] = {1, 2};
    graph[1] = {0, 3, 4};
    graph[2] = {0};
    graph[3] = {1};
    graph[4] = {1};

    vector<int> parent = findParents(graph);

    for (int i = 0; i < parent.size(); i++) {
        cout << 'Node ' << i << ': ';
        if (parent[i] == -1) {
            cout << i << endl;
        } else {
            cout << parent[i] << endl;
        }
    }

    return 0;
}

输出结果为:

Node 0: 0
Node 1: 0
Node 2: 0
Node 3: 1
Node 4: 1

节点0的父亲是自己,节点1的父亲是节点0,节点2的父亲是节点0,节点3的父亲是节点1,节点4的父亲是节点1。

无向图父子关系查找:深度优先搜索算法实现

原文地址: https://www.cveoy.top/t/topic/qja8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录