步骤
- 将一个入度为0的点设置为起点
- 删除该入度为0的顶点,及其相连接的边
- 继续找下一个入度为0的点,重复上述步骤。直到图中的所有点入度都为零
代码实现(使用DFS进行拓扑排序)
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited, stack<int>& st) {
visited[node] = true;
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
dfs(neighbor, graph, visited, st);
}
}
st.push(node);
}
vector<int> topologicalSort(vector<vector<int>>& graph, int numNodes) {
vector<bool> visited(numNodes, false);
stack<int> st;
for (int i = 0; i < numNodes; i++) {
if (!visited[i]) {
dfs(i, graph, visited, st);
}
}
vector<int> result;
while (!st.empty()) {
result.push_back(st.top());
st.pop();
}
return result;
}
int main() {
int numNodes = 6;
vector<vector<int>> graph(numNodes);
graph[5].push_back(2);
graph[5].push_back(0);
graph[4].push_back(0);
graph[4].push_back(1);
graph[2].push_back(3);
graph[3].push_back(1);
cout << "Topological Sort Result:" << endl;
vector<int> result = topologicalSort(graph, numNodes);
for (int node : result) {
cout << node << " ";
}
cout << endl;
return 0;
}