给定一个有向图,图节点的拓扑排序被定义为:
- 对于每条有向边A--> B,则A必须排在B之前
- 拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点
找到给定图的任一拓扑排序
注意事项
你可以假设图中至少存在一种拓扑排序
/**
* 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
vector<DirectedGraphNode*> res;
if (graph.size() == 0) {
return res;
}
unordered_map<DirectedGraphNode*, int> maps;
stack<DirectedGraphNode*> st;
// compute inbonds
for (int i = 0; i < graph.size(); i++) {
for (int j = 0; j < graph[i]->neighbors.size(); j++) {
if (maps.find(graph[i]->neighbors[j]) == maps.end()) {
maps[graph[i]->neighbors[j]] = 1;
} else {
maps[graph[i]->neighbors[j]]++;
}
}
}
// find first zero inbond nodes
for (int i = 0; i < graph.size(); i++) {
if (maps.find(graph[i]) == maps.end()) {
st.push(graph[i]);
}
}
if (st.empty()) {
return res;
}
while (!st.empty()) {
DirectedGraphNode* dgn = st.top();
res.push_back(dgn);
st.pop();
for (int j = 0; j < dgn->neighbors.size(); j++) {
if (--maps[dgn->neighbors[j]] == 0) {
st.push(dgn->neighbors[j]);
}
}
}
return res;
}
};