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;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值