图的表示方法与深度优先搜索

图的表示方法:

1.邻接矩阵:

使用二维数组,matrix [ i ][ j ] 表示从 i 到 j 的边,无向图通常会把matrix [ i ][ j ]和matrix [ j ][ i ]同时设置

#include <iostream>
#include <vector>

using namespace std;

const int MAX_VERTICES = 100;

class Graph {
private:
    int V; // 图的顶点数
    bool adjMatrix[MAX_VERTICES][MAX_VERTICES];

public:
    Graph(int V) {
        this->V = V;
        for (int i = 0; i < V; i++) {
            for (int j = 0; j < V; j++) {
                adjMatrix[i][j] = false;
            }
        }
    }

    // 添加边
    void addEdge(int v, int w) {
        adjMatrix[v][w] = true;
        // 如果是无向图,则需要设置对称的边
        adjMatrix[w][v] = true;
    }
};

2.邻接表:

邻接表使用一组链表来表示图的连接关系。对于每个顶点,都有一个与之相邻的顶点链表,这个链表存储与该顶点直接相连的边。

#include <iostream>
#include <vector>

using namespace std;

class Graph {
private:
    int V; // 图的顶点数
    vector<vector<int>> adjList; // 邻接表

public:
    Graph(int V) {
        this->V = V;
        adjList.resize(V);
    }

    // 添加边
    void addEdge(int v, int w) {
        adjList[v].push_back(w);
        // 如果是无向图,需要添加对称的边
        // adjList[w].push_back(v);
    }
};

 

 深度优先搜索:

1.基于堆栈实现:

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

// 用邻接表表示图的结构
class Graph {
private:
    int V; // 图的顶点数
    vector<vector<int>> adjList; // 邻接表

public:
    Graph(int V) {
        this->V = V;
        adjList.resize(V);
    }

    // 添加边
    void addEdge(int v, int w) {
        adjList[v].push_back(w);
    }

    // 深度优先搜索
    void DFS(int start) {

// 记录顶点是否被访问过,避免无限循环或遗漏
        vector<bool> visited(V, false); 
        stack<int> dfsStack;

        dfsStack.push(start);
        visited[start] = true;

        while (!dfsStack.empty()) {
            int currVertex = dfsStack.top();
            dfsStack.pop();

            cout << currVertex << " "; // 处理当前顶点

            // 遍历当前顶点的所有邻接顶点
            for (int neighbor : adjList[currVertex]) {
                if (!visited[neighbor]) {
                    dfsStack.push(neighbor);
                    visited[neighbor] = true;
                }
            }
        }
    }
};

int main() {
    // 创建一个有向图
    Graph g(6);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 3);
    g.addEdge(1, 4);
    g.addEdge(2, 4);
    g.addEdge(3, 4);
    g.addEdge(3, 5);
    g.addEdge(4, 5);

    cout << "Depth First Traversal (starting from vertex 0): ";
    g.DFS(0);

    return 0;
}

2. 基于递归实现

#include <iostream>
#include <vector>

using namespace std;

class Graph {
private:
    int V; // 图的顶点数
    vector<vector<int>> adjList; // 邻接表
    vector<bool> visited; // 记录顶点是否被访问过

public:
    Graph(int V) {
        this->V = V;
        adjList.resize(V);
        visited.resize(V, false);
    }

    // 添加边
    void addEdge(int v, int w) {
        adjList[v].push_back(w);
        // 如果是无向图,需要添加对称的边
        // adjList[w].push_back(v);
    }

    // 深度优先搜索
    void DFS(int v) {
        visited[v] = true;
        cout << v << " "; // 处理当前顶点

        // 递归遍历所有未访问的邻接顶点
        for (int neighbor : adjList[v]) {
            if (!visited[neighbor]) {
                DFS(neighbor);
            }
        }
    }
};

int main() {
    // 创建一个有向图
    Graph g(5);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 3);
    g.addEdge(2, 4);

    cout << "Depth First Traversal (starting from vertex 0): ";
    g.DFS(0);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值