无向图父子关系查找:深度优先搜索算法实现
可以使用深度优先搜索(DFS)来解决这个问题。首先,创建一个数组来保存每个节点的父亲节点。然后,从任意一个节点开始进行DFS遍历,遍历过程中更新每个节点的父亲节点。
具体步骤如下:
- 创建一个大小为n的整型数组parent,初始化所有元素为-1,表示所有节点都没有父亲节点。
- 选择一个起始节点start,将其父亲节点设置为自己,即parent[start] = start。
- 对于start的每个邻接节点v,如果v的父亲节点为-1,即v还没有被访问过,那么将v的父亲节点设置为start,即parent[v] = start,并对v进行DFS遍历。
- 返回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 著作权归作者所有。请勿转载和采集!