在计算机科学中,图(Graph)是一种非常重要的非线性数据结构,广泛应用于社交网络、路径规划、编译器设计等领域。对于初学者来说,掌握C++图的表示方法是学习图算法的第一步。本文将详细讲解如何在C++中实现图的两种经典表示方式:邻接矩阵和邻接表,并提供清晰易懂的代码示例。

图由顶点(Vertex)和边(Edge)组成。如果边有方向,则称为有向图;否则为无向图。根据边是否带有权重,又可分为带权图和无权图。
邻接矩阵使用一个二维数组来表示图。假设图有 n 个顶点,则创建一个 n × n 的矩阵 adj[n][n]。如果顶点 i 和顶点 j 之间有边,则 adj[i][j] = 1(无权图)或 adj[i][j] = weight(带权图);否则为 0 或无穷大。
#include <iostream>#include <vector>using namespace std;class Graph {private: int V; // 顶点数量 vector<vector<int>> adjMatrix;public: Graph(int vertices) { V = vertices; adjMatrix.resize(V, vector<int>(V, 0)); } void addEdge(int u, int v) { adjMatrix[u][v] = 1; adjMatrix[v][u] = 1; // 无向图,对称 } void printGraph() { for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { cout << adjMatrix[i][j] << " "; } cout << endl; } }};int main() { Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 3); cout << "邻接矩阵表示:\n"; g.printGraph(); return 0;}邻接表使用一个数组(或向量)存储所有顶点,每个顶点对应一个链表(或动态数组),用于存储与其相邻的所有顶点。这是处理稀疏图更高效的方式。
#include <iostream>#include <vector>using namespace std;class Graph {private: int V; vector<vector<int>> adjList;public: Graph(int vertices) { V = vertices; adjList.resize(V); } void addEdge(int u, int v) { adjList[u].push_back(v); adjList[v].push_back(u); // 无向图 } void printGraph() { for (int i = 0; i < V; i++) { cout << "顶点 " << i << ": "; for (int neighbor : adjList[i]) { cout << neighbor << " "; } cout << endl; } }};int main() { Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 3); cout << "邻接表表示:\n"; g.printGraph(); return 0;}- 如果图是稠密图(边数接近 V²),使用邻接矩阵更合适。
- 如果图是稀疏图(边数远小于 V²),推荐使用C++邻接表以节省内存。
本文详细介绍了图数据结构实现的两种核心方法:邻接矩阵和邻接表,并提供了完整的 C++ 代码示例。无论你是算法竞赛选手还是软件开发初学者,掌握这两种表示方法都是迈向高级图算法(如 DFS、BFS、Dijkstra 等)的重要基础。
记住:C++图的表示方法没有绝对的好坏,关键在于根据实际问题选择合适的结构。希望这篇教程能帮助你轻松入门图论编程!
本文由主机测评网于2025-12-27发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251213174.html