lintcode(127)拓扑排序

来源:互联网 发布:mssql数据库备份分离 编辑:程序博客网 时间:2024/05/17 01:35

Description:

给定一个有向图,图节点的拓扑排序被定义为:

  • 对于每条有向边A--> B,则A必须排在B之前  
  • 拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点  

找到给定图的任一拓扑排序

Explanation:

对于下列图:


这个图的拓扑排序可能是:

[0, 1, 2, 3, 4, 5]

或者

[0, 2, 3, 1, 5, 4]

或者

....

Solution:

BFS.Go through the graph to record the node and its preNodes in a hash map. If the list of one node's preNodes is null, push it to the result, and then remove it from the graph and the list of preNodes of other nodes. Repeat until the graph is null.

/** * Definition for Directed graph. * class DirectedGraphNode { *     int label; *     ArrayList<DirectedGraphNode> neighbors; *     DirectedGraphNode(int x) { label = x; neighbors = new ArrayList<DirectedGraphNode>(); } * }; */public class Solution {    /**     * @param graph: A list of Directed graph node     * @return: Any topological order for the given graph.     */        public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {        // write your code here        ArrayList<DirectedGraphNode> result = new ArrayList<DirectedGraphNode>();        if(graph == null || graph.size() == 0){            return result;        }        HashMap<DirectedGraphNode , HashSet<DirectedGraphNode>> record = new HashMap<DirectedGraphNode , HashSet<DirectedGraphNode>>();                for(DirectedGraphNode temp : graph){            record.put(temp , new HashSet<DirectedGraphNode>());        }                for(DirectedGraphNode temp : graph){            for(DirectedGraphNode neighbor : temp.neighbors){                record.get(neighbor).add(temp);            }                               }                while(graph.size() > 0){            for(int i = 0;i<graph.size();i++){                DirectedGraphNode temp = graph.get(i);                if(record.get(temp).size() == 0){                    result.add(temp);                    graph.remove(temp);                    for(DirectedGraphNode node : graph){                        if(record.get(node).contains(temp)){                            record.get(node).remove(temp);                        }                    }                }            }        }        return result;    }}