Graph
For example:
{1,2,4#2,1,4#3,5#4,1,2#5,3}
represents follow graph:
1------2 3
\ | |
\ | |
\ | |
\ | |
4 5
we use #
to split each node information.1,2,4
represents that 2
, 4
are 1
's neighbors 即1->2->42,1,4
represents that 1
, 4
are 2
's neighbors 即2->1->43,5
represents that 5
is 3
's neighbor 即3->54,1,2
represents that 1
, 2
are 4
's neighbors 即4->1->25,3
represents that 3
is 5
's neighbor 即5->3
拓扑排序:
代码:
/**
* 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*> result;
map<DirectedGraphNode*, int> hashmap;
queue<DirectedGraphNode*> q;
for (int i=0; i<graph.size(); ++i) {
for (int j=0; j<graph[i]->neighbors.size(); ++j) {
if (hashmap.find(graph[i]->neighbors[j])==hashmap.end()) {
hashmap[graph[i]->neighbors[j]]=1;
} else {
hashmap[graph[i]->neighbors[j]]++;//hashmap记录每个结点的入度
}
}
}
for (int i=0; i<graph.size(); ++i) {
if (hashmap[graph[i]]==0) {
q.push(graph[i]);
result.push_back(graph[i]);
}//将入度为0的点压入栈中,若无入度为0的点则q.top等于0
}
while(!q.empty()) {
DirectedGraphNode * node = q.front();
q.pop();
for (int i=0;i<node->neighbors.size();i++) {
hashmap[node->neighbors[i]]--;
if (hashmap[node->neighbors[i]]==0) {
result.push_back(node->neighbors[i]);
q.push(node->neighbors[i]);
}
}
}
return result;
}
};