C++如何表示无向图和有向图?
时间: 2024-10-03 15:01:34 浏览: 34
在C++中,有几种常用的数据结构可以用来表示无向图和有向图:
### 1. 无向图:
#### (1) 邻接矩阵:
邻接矩阵是一个二维数组,其中行代表源节点,列代表目标节点,值为边的数量或边的权重。如果两个节点之间没有直接连接,则对应位置的值通常设置为0。
```cpp
int graph[vertices][vertices];
```
#### (2) 邻接表:
邻接表使用链表(例如`std::list`、`std::vector`等)存储每个节点的邻居,每个节点对应一个链表节点,包含到其相邻节点的指针。
```cpp
struct Node {
int destination;
// 可能还有其他数据(如权重)
std::list<int> neighbors;
};
std::vector<Node> adjList[vertexCount]; // 使用vector保存所有节点
```
### 2. 有向图:
#### (1) 有向邻接矩阵:
类似无向图,但只有从源节点到目标节点的边,对于每条边(u, v),邻接矩阵只在第u行的v列处有一个值。
```cpp
int directedGraph[vertices][vertices];
```
#### (2) 有向邻接列表(DAG, Directed Acyclic Graph):
每个节点也有一个指向其后继节点的链表,表示有向边的方向。
```cpp
struct DirectedNode {
int destination;
std::list<DirectedNode*> outgoingEdges; // 存储指向后继节点的指针
};
std::vector<DirectedNode*> adjList[vertexCount];
```
这些数据结构提供了不同的操作接口,比如添加/删除边、查找路径等。选择哪种取决于具体的应用场景,比如需要频繁进行邻接查询还是边的操作更多。此外,还可以考虑使用图库如Boost.Graph或TR1 graphs。如果你对特定的操作有疑问,随时告诉我。
阅读全文