127 拓扑排序

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 24 are 1's neighbors  即1->2->4
2,1,4 represents that 14 are 2's neighbors  即2->1->4
3,5 represents that 5 is 3's neighbor               即3->5
4,1,2 represents that 12 are 4's neighbors  即4->1->2
5,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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41413441/article/details/81115971
今日推荐