题目: 拓扑排序

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


•对于每条有向边A--> B,则A必须排在B之前 

•拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点 



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




您在真实的面试中是否遇到过这个题?

Yes





样例

对于下列图:




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

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

或者

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

或者

....




注意

你可以假设图中至少存在一种拓扑排序


挑战

能否分别用BFS和DFS完成?

标签 Expand   

解题思路:
用一个map<node,set<node>> 其中node表示的是该节点,set表示指向node的节点
1.在图中找到一个符合拓扑排序的第一个节点的条件的节点,减去该节点以及该节点所有的路径

2.循环1直至没有节点存在了。

/**
 * 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> res = new ArrayList<>();
    	if(0==graph.size()||null==graph)
    		return res;
    	HashMap<DirectedGraphNode, HashSet<DirectedGraphNode> > map = new HashMap<>();
    	for(DirectedGraphNode node:graph){
    		HashSet<DirectedGraphNode> direcSet= new HashSet<>(); 
    		map.put(node,direcSet);    		
    	}
    	for(DirectedGraphNode node:graph){
    		for(DirectedGraphNode nb:node.neighbors)
    			map.get(nb).add(node);    		
    	}
    	while(graph.size()>0){    		
    		for(int i=0;i<graph.size();i++){
    			DirectedGraphNode tmp  = graph.get(i);
    			if(map.get(tmp).size()==0){
    				res.add(tmp);
    				graph.remove(tmp);
    				for(DirectedGraphNode leave:graph){
    					if(map.get(leave).contains(tmp))
    						map.get(leave).remove(tmp);
    				}
    			}
    		}
    	}
    	
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值