有向图存储在邻接表中,设计一个算法,按深度优先搜索策略对其进行拓扑排序,写出C++代码
时间: 2024-10-11 11:02:26 浏览: 31
在有向图中,使用邻接表存储可以更高效地处理节点之间的连接。要按照深度优先搜索(DFS)策略对图进行拓扑排序,我们需要遍历每个顶点并记录它们的入度。当一个顶点的所有前驱都有序时,我们就可以将其加入到结果序列中。以下是使用C++实现的一个简单的深度优先搜索和拓扑排序算法:
```cpp
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// 图的邻接表表示
class Graph {
private:
vector<vector<int>> adj; // 存储邻接表
public:
// 添加边
void addEdge(int src, int dest) {
adj[src].push_back(dest);
}
// 深度优先搜索
vector<int> dfs(int node, vector<bool>& visited, stack<int>& topoOrder) {
visited[node] = true;
for (int neighbor : adj[node]) {
if (!visited[neighbor])
topoOrder.push(dfs(neighbor, visited, topoOrder));
}
return topoOrder;
}
// 拓扑排序
vector<int> topologicalSort() {
vector<int> result;
vector<bool> visited(adj.size(), false); // 初始化访问标记
// 对所有未访问的节点进行DFS
for (int i = 0; i < adj.size(); ++i)
if (!visited[i])
topoOrder.push(dfs(i, visited, stack<int>()));
// 反转栈得到拓扑排序的结果
while (!topoOrder.empty()) {
result.push_back(topoOrder.top());
topoOrder.pop();
}
return result;
}
};
int main() {
Graph g;
// 构建图... (添加边)
vector<int> sortedOrder = g.topologicalSort();
cout << "拓扑排序结果:";
for (int num : sortedOrder) {
cout << num << " ";
}
cout << endl;
return 0;
}
```
在这个代码中,`Graph`类包含邻接表,并实现了添加边、深度优先搜索以及拓扑排序的功能。在`main()`函数里,你可以根据需要构建图结构,并调用`topologicalSort()`函数获取拓扑排序的结果。
阅读全文