如何用C++正确地实现邻接矩阵表示的图进行拓扑排序?
时间: 2024-12-22 22:26:17 浏览: 21
在C++中,使用邻接矩阵表示图并进行拓扑排序的一般步骤如下:
1. **创建邻接矩阵**:首先,你需要一个二维数组或者动态数组,其中每个元素表示两个顶点之间是否存在边。如果从i到j有边,则对应位置设为1或true,否则为0或false。
```cpp
vector<vector<bool>> adjMatrix(numVertices, vector<bool>(numVertices, false));
```
2. **读取边的信息**:遍历图的数据结构,比如边的列表,将每条边的起点和终点对应的邻接矩阵位置设置为真。
3. **标记入度**:对于每个节点,初始化一个入度数组,表示有多少条边指向该节点。这一步通常用于找到入度为0的节点,因为它们是拓扑排序的起点。
```cpp
vector<int> indegree(numVertices, 0);
for (int i = 0; i < numVertices; ++i) {
for (int j = 0; j < numVertices; ++j) {
if (adjMatrix[i][j]) {
++indegree[j];
}
}
}
```
4. **拓扑排序**:开始从入度为0的节点开始,将其加入结果序列,并减去指向它的所有节点的入度。然后继续寻找下一个入度为0的节点,直到所有节点都被处理过。
```cpp
vector<int> topoSort;
stack<int> s;
for (int i = 0; i < numVertices; ++i) {
if (indegree[i] == 0) {
s.push(i);
}
}
while (!s.empty()) {
int u = s.top(); // 弹出第一个节点
s.pop();
topoSort.push_back(u); // 添加到排序序列
for (int v = 0; v < numVertices; ++v) {
if (adjMatrix[u][v] && --indegree[v] == 0) { // 减小v的入度并检查是否新的起始点
s.push(v);
}
}
}
```
5. **检查结果有效性**:最后,检查排序结果是否有效,即对于无环图,排序后的节点顺序应该满足有向图的拓扑性质,即对于任意u<v,不存在从u到v的路径。
阅读全文