数据结构图的算法问题,求大神帮忙。

连通图G和G中的一个结点v,设计算法,求G的生成树(支撑树)T。其中生成树的根是v,T的层次遍历次序是以v为起点的G的某个广度优先遍历次序。用C或C++写出算法的思想,设计G和T的存储结构,最好给出注释。谢谢。

以下是基于广度优先遍历的算法思路:

定义一个队列Q,把v加入队列中,并把v标记为已访问
定义一个数组parent[],用于记录每个节点在生成树中的父节点,初始化为-1
定义一个数组visited[],用于记录每个节点是否已经访问过,初始化为false
当队列Q非空时,重复执行以下操作:
从队列Q中取出一个节点u
遍历u的邻居节点,对于每个未访问过的邻居节点w,执行以下操作:
把w标记为已访问
把w的父节点设置为u,即 parent[w] = u
把w加入队列Q中
生成树T的边集为{(parent[v],v) | v 是G中除了根节点之外的已访问节点}
下面是算法的C++实现:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

// 存储图的邻接表结构
struct Graph {
    int V; // 节点数
    vector<vector<int>> adj; // 邻接表
};

// 生成树的边结构
struct Edge {
    int from, to;
};

// 生成树的边集
vector<Edge> get_spanning_tree(const Graph& G, int root) {
    vector<Edge> T; // 存储生成树的边集
    queue<int> Q; // 存储待遍历的节点
    vector<bool> visited(G.V, false); // 记录每个节点是否已访问
    vector<int> parent(G.V, -1); // 记录每个节点在生成树中的父节点
    Q.push(root);
    visited[root] = true;
    while (!Q.empty()) {
        int u = Q.front();
        Q.pop();
        for (int v : G.adj[u]) {
            if (!visited[v]) {
                visited[v] = true;
                parent[v] = u;
                Q.push(v);
            }
        }
    }
    for (int v = 0; v < G.V; v++) {
        if (v != root && visited[v]) {
            T.push_back({parent[v], v});
        }
    }
    return T;
}

int main() {
    // 创建示例图
    Graph G;
    G.V = 5;
    G.adj.resize(5);
    G.adj[0] = {1, 2};
    G.adj[1] = {0, 3, 4};
    G.adj[2] = {0};
    G.adj[3] = {1};
    G.adj[4] = {1};

    // 计算以0为根的生成树
    vector<Edge> T = get_spanning_tree(G, 0);

    // 输出生成树的边集
    cout << "生成树的边集:" << endl;
    for (Edge e : T) {
        cout << "(" << e.from << ", " << e.to << ")" << endl;
    }

    return 0

```c++


```