可以使用深度优先搜索(DFS)来解决这个问题。我们从任意一个节点开始,递归地遍历它的邻居节点,设置每个邻居节点的父节点为当前节点。如果一个节点已经有父节点了,就不再递归遍历它的邻居节点。

具体实现如下:

#include <iostream>
#include <vector>

using namespace std;

const int MAXN = 100000; // 最大节点数量

vector<int> graph[MAXN+1]; // 图的邻接表表示
int parent[MAXN+1]; // 每个节点的父节点

void dfs(int node, int parent_node) {
    parent[node] = parent_node; // 设置当前节点的父节点
    
    for (int i = 0; i < graph[node].size(); i++) {
        int neighbor = graph[node][i];
        
        if (parent[neighbor] == 0) { // 如果邻居节点没有父节点,则递归遍历它
            dfs(neighbor, node);
        }
    }
}

int main() {
    int n, m; // 节点数量和边数量
    cin >> n >> m;
    
    // 读入图的边
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }
    
    // 从节点1开始进行深度优先搜索
    dfs(1, 0);
    
    // 输出每个节点的父亲
    for (int i = 1; i <= n; i++) {
        cout << parent[i] << " ";
    }
    cout << endl;
    
    return 0;
}

在这个实现中,我们使用一个数组graph来表示图的邻接表,数组parent来存储每个节点的父节点。在深度优先搜索的过程中,我们使用递归来遍历每个节点的邻居节点,设置它们的父节点,并且避免重复遍历已经有父节点的节点。最后,我们输出每个节点的父节点即可。


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

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