难点:如何实现深度优先遍历和广度优先遍历的算法。

解决方法:可以使用递归来实现深度优先遍历算法,使用队列来实现广度优先遍历算法。具体实现方法可以参考以下代码:

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

template<class T>
struct ArcNode {
    int adjvex;
    ArcNode<T> *nextarc;
};

template<class T>
struct VertexNode {
    T data;
    ArcNode<T> *firstarc;
};

template<class T>
class ALGraph {
private:
    VertexNode<T> *adjlist;
    int num_vertex;
    int num_edge;
    bool *visited;

public:
    ALGraph(T ch[], int n, int e) {
        num_vertex = n;
        num_edge = e;
        adjlist = new VertexNode<T>[num_vertex];
        visited = new bool[num_vertex];

        for (int i = 0; i < num_vertex; i++) {
            adjlist[i].data = ch[i];
            adjlist[i].firstarc = nullptr;
            visited[i] = false;
        }

        cout << "请输入有向图的边:" << endl;
        for (int i = 0; i < num_edge; i++) {
            int v1, v2;
            cin >> v1 >> v2;
            ArcNode<T> *arc1 = new ArcNode<T>;
            arc1->adjvex = v2;
            arc1->nextarc = adjlist[v1].firstarc;
            adjlist[v1].firstarc = arc1;
        }
    }

    void DFS() {
        for (int i = 0; i < num_vertex; i++) {
            if (!visited[i]) {
                DFS(i);
            }
        }
    }

    void DFS(int v) {
        visited[v] = true;
        cout << adjlist[v].data << " ";

        ArcNode<T> *arc = adjlist[v].firstarc;
        while (arc) {
            if (!visited[arc->adjvex]) {
                DFS(arc->adjvex);
            }
            arc = arc->nextarc;
        }
    }

    void BFS() {
        queue<int> q;
        for (int i = 0; i < num_vertex; i++) {
            visited[i] = false;
        }

        for (int i = 0; i < num_vertex; i++) {
            if (!visited[i]) {
                visited[i] = true;
                cout << adjlist[i].data << " ";
                q.push(i);

                while (!q.empty()) {
                    int v = q.front();
                    q.pop();

                    ArcNode<T> *arc = adjlist[v].firstarc;
                    while (arc) {
                        if (!visited[arc->adjvex]) {
                            visited[arc->adjvex] = true;
                            cout << adjlist[arc->adjvex].data << " ";
                            q.push(arc->adjvex);
                        }
                        arc = arc->nextarc;
                    }
                }
            }
        }
    }
};

int main() {
    cout << "项目实现人:高明霞" << endl;
    string ch[] = {"v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9"};
    int n, e;
    cout << "请输入有向图的顶点数:" << endl;
    cin >> n;
    cout << "请输入有向图的边数:" << endl;
    cin >> e;
    ALGraph<string> ALG(ch, n, e);
    cout << "深度优先遍历序列是:";
    ALG.DFS();
    cout << endl;
    cout << "广度优先遍历序列是:";
    ALG.BFS();
    cout << endl;
    return 0;
}

在这段代码中,ALGraph是一个模板类,用于表示有向图的邻接表。DFS()函数使用递归算法实现深度优先遍历,BFS()函数使用队列实现广度优先遍历


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

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