(1)入度为0的点入栈
(2)销毁节点,和与给节点相连的边
(3)重复上过程,直到没有元素。 若栈为空时,节点没有完全取出,则证明图中有环
对上图进行拓扑排序的结果:
2->8->0->3->7->1->5->6->9->4->11->10->12
- //拓扑排序
- void Graph::topologicalSort()
- {
- int i, vertex;
- queue<int> q;
- //遍历,入度为零的顶点入队
- for (i = 0; i < numV; i++)
- if (indegree[i] == 0)
- q.push(i);
- bool *visited = new bool[numV];
- for (i = 0; i < numV; i++)
- visited[i] = false;
- while (!q.empty())
- {
- vertex = q.front();
- q.pop();
- cout << setw(4) << vertex;
- visited[vertex] = true;
- for (i = 0; i < numV; i++)
- if (matrix[vertex][i] == 1)
- {
- //调整入度,入度为0则需入队
- if (!(--indegree[i]))
- q.push(i);
- }
- }
- cout << endl;
- for (i = 0; i < numV; i++)
- if (!visited[i])
- cout << "该有向图有环!";
- cout << endl;
- delete[]visited;
- }