给定一个有向图,图节点的拓扑排序定义如下:
- 对于图中的每一条有向边
A -> B
, 在拓扑排序中A一定在B之前. - 拓扑排序中的第一个节点可以是图中的任何一个没有其他节点指向它的节点.
针对给定的有向图找到任意一种拓扑排序的顺序.
样例
For graph as follow:
The topological order can be:
[0, 1, 2, 3, 4, 5]
[0, 2, 3, 1, 5, 4]
...
挑战
能否分别用BFS和DFS完成?
说明
注意事项
你可以假设图中至少存在一种拓扑排序
/**
* Definition for Directed graph.
* struct DirectedGraphNode {
* int label;
* vector<DirectedGraphNode *> neighbors;
* DirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
/*
* @param graph: A list of Directed graph node
* @return: Any topological order for the given graph.
*/
vector<DirectedGraphNode*> topSort(vector<DirectedGraphNode*>& graph) {
// write your code here
int array[graph.size()] = {0}; //入度数组
for(int i = 0; i < graph.size(); i++)
{
//cout << graph[i]->label << " := ";
for(int j = 0; j < graph[i]->neighbors.size(); j++)
{
//cout << graph[i]->neighbors[j]->label << " ";
array[graph[i]->neighbors[j]->label]++;
}
//cout << endl;
}
stack<int> mystack;
for(int i = 0; i < graph.size(); i++)
{
if(array[i] == 0)
mystack.push(i);
}
vector<DirectedGraphNode*> ret;
while(!mystack.empty())
{
int top = mystack.top();
mystack.pop();
ret.push_back(graph[top]);
for(int i = 0; i < graph[top]->neighbors.size(); i++)
{
array[graph[top]->neighbors[i]->label]--;
if(array[graph[top]->neighbors[i]->label] == 0)
mystack.push(graph[top]->neighbors[i]->label);
}
}
// for(auto& x : array)
// cout << x << " ";
//cout << endl;
return ret;
}
};