拓扑排序-LintCode

来源:互联网 发布:淘宝优惠券在哪里查看 编辑:程序博客网 时间:2024/06/05 05:04

给定一个有向图,图节点的拓扑排序被定义为:
对于每条有向边A–> B,则A必须排在B之前  
拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点  
找到给定图的任一拓扑排序
样例
对于下列图:

这里写图片描述

这个图的拓扑排序可能是:
[0, 1, 2, 3, 4, 5]
或者
[0, 2, 3, 1, 5, 4]
或者
……

/** * 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*> v;        map<DirectedGraphNode*,int> m;        queue<DirectedGraphNode*> q;        if(graph.empty())            return v;        for(auto c:graph)            for(auto t:c->neighbors)            {                ++m[t];            }        for(auto t:graph)            if(m[t]==0)                q.push(t);        while(!q.empty())        {            DirectedGraphNode *cur=q.front();            q.pop();            v.push_back(cur);            for(auto t:cur->neighbors)            {                if(--m[t]==0)                    q.push(t);            }        }        return v;    }};
原创粉丝点击