数据结构-图

2023-12-13 09:11:48

介绍

图(Graph)是一种非线性数据结构,由节点(顶点)和边组成。节点表示实体,而边表示这些实体之间的关系。图可以分为有向图和无向图两种。

图分类
  1. 有向图:边具有方向性,从一个节点指向另一个节点。在有向图中,节点之间的关系是单向的。
  2. 无向图:边没有方向性,连接两个节点。在无向图中,节点之间的关系是双向的。
图的特点
  1. 节点可以有多个相邻节点,节点的数量没有限制。
  2. 边可以连接任意两个节点,表示节点之间的关系。
  3. 图中的节点和边可以具有权重,表示某种度量或成本。

实现举例

#include <iostream>
#include <vector>

using namespace std;

class Graph {
private:
    vector<vector<int>> adjList;
    int numVertices;

public:
    Graph(int vertices): numVertices(vertices) {
        adjList.resize(vertices);
    }

    void addEdge(int u, int v) {
        adjList[u].push_back(v);
        adjList[v].push_back(u); // 对于无向图,需要添加双向边
    }

    void printGraph() {
        for (int i = 0; i < numVertices; i++) {
            cout << "Vertex " << i << ": ";
            for (int j : adjList[i]) {
                cout << j << " ";
            }
            cout << endl;
        }
    }
};

int main() {
    Graph g(5); // 创建一个包含5个顶点的图
    g.addEdge(0, 1); // 添加边 (0, 1)
    g.addEdge(0, 4); // 添加边 (0, 4)
    g.addEdge(1, 2); // 添加边 (1, 2)
    g.addEdge(1, 3); // 添加边 (1, 3)
    g.addEdge(1, 4); // 添加边 (1, 4)
    g.addEdge(2, 3); // 添加边 (2, 3)
    g.addEdge(3, 4); // 添加边 (3, 4)

    g.printGraph(); // 打印图的信息

    return 0;
}
实例说明

在示例中,创建了一个Graph类,它使用一个邻接列表来存储节点和边的信息。addEdge函数用于添加边,并使用双向连接来表示无向图。printGraph函数用于打印图的邻接列表。在main函数中,创建了一个包含5个顶点的图,并添加了一些边。最后,调用printGraph函数来打印图的信息。

总结

图数据结构在实际应用中具有广泛的用途,例如:

  1. 社交网络分析:将用户作为节点,用户之间的关系作为边,可以分析社交网络中的连接和影响力。
  2. 地图导航:将地点作为节点,道路作为边,可以使用图算法计算最短路径、最快路径等。
  3. 网络流量优化:将网络设备作为节点,连接设备的通信线路作为边,可以使用图算法优化网络流量和提高网络性能。
  4. 推荐系统:将用户和物品作为节点,用户对物品的喜好程度作为边,可以使用图算法为用户推荐相关物品。

常见的图算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra、Floyd-Warshall等)、最小生成树算法(Prim、Kruskal等)等。这些算法可以用于遍历图、查找路径、优化网络等任务。

文章来源:https://blog.csdn.net/scy518/article/details/134962562
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。