图的概念及其应用(c++实现)

图是一种表示对象间关系的数据结构,常用于社交网络分析、路线规划和电路设计。文章展示了图的节点和边的定义,并提供了C++实现的深度优先遍历(DFS)和广度优先遍历(BFS)算法。
摘要由CSDN通过智能技术生成

图是由节点(vertex)和边(edge)组成的一种数据结构,通常用来表示具有一定联系的对象之间的关系。图可以用来解决许多实际问题,例如路线规划、社交网络分析、电路设计等。

图的应用非常广泛,以下是一些常见的应用场景:

1. 社交网络分析:图可以用来表示人与人之间的关系,例如好友关系、职业关系等,以及对这些关系进行分析和预测。

2. 路线规划:图可以用来表示城市中的道路和交通方式,以及对最短路径和最优路径进行计算。

3. 电路设计:图可以用来表示电路中的器件和线路,以及对电路进行分析和优化。

4. 统计学习:图可以用来表示数据之间的关系,例如分类、聚类等。

5. 自然语言处理:图可以用来表示单词之间的关系,例如词义相似度、语法结构等。

以下是一个简单的图的实现,包括节点和边的定义以及图的遍历算法。```c++
 

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

// 节点定义
struct Vertex {
    int val;
    vector<int> edges;
    bool visited;
    Vertex(int v): val(v), visited(false) {}
};

// 边定义
struct Edge {
    int from, to;
    Edge(int f, int t): from(f), to(t) {}
};

// 图定义
class Graph {
public:
    Graph(int n): nodes(n) {}
    void addEdge(int from, int to) {
        nodes[from].edges.push_back(to);
        edges.push_back(Edge(from, to));
    }
    void dfs(int start) {
        dfsHelper(start);
        for (int i = 0; i < nodes.size(); i++) {
            if (!nodes[i].visited) {
                dfsHelper(i);
            }
        }
    }
    void bfs(int start) {
        queue<int> q;
        q.push(start);
        nodes[start].visited = true;
        while (!q.empty()) {
            int cur = q.front();
            q.pop();
            cout << cur << " ";
            for (int i = 0; i < nodes[cur].edges.size(); i++) {
                int next = nodes[cur].edges[i];
                if (!nodes[next].visited) {
                    nodes[next].visited = true;
                    q.push(next);
                }
            }
        }
    }
private:
    void dfsHelper(int cur) {
        nodes[cur].visited = true;
        cout << cur << " ";
        for (int i = 0; i < nodes[cur].edges.size(); i++) {
            int next = nodes[cur].edges[i];
            if (!nodes[next].visited) {
                dfsHelper(next);
            }
        }
    }
    vector<Vertex> nodes;
    vector<Edge> edges;
};

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

    // 深度优先遍历
    cout << "DFS: ";
    g.dfs(0);
    cout << endl;

    // 广度优先遍历
    cout << "BFS: ";
    g.bfs(0);
    cout << endl;

    return 0;
}

输出:

```
DFS: 0 1 3 4 2 
BFS: 0 1 2 3 4 
```

这个例子中,我们创建了一个有向图,包含5个节点和5条边。然后我们对这个图进行了深度优先遍历和广度优先遍历,并输出了遍历结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值