环和有向无环图

本文探讨了优先级限制下的调度问题,该问题可以通过有向无环图(DAG)的拓扑排序来解决。定义了拓扑排序的概念,即在有向无环图中按一定顺序排列顶点。介绍了有向环检测的重要性,如果存在环,则无法进行拓扑排序。基于深度优先搜索(DFS)的算法可以用于检测有向环以及进行拓扑排序。拓扑排序的时间复杂度与图的顶点和边的数量成正比。在实际应用中,需要首先确保图无环,然后进行拓扑排序以解决调度问题。
摘要由CSDN通过智能技术生成


在和有向图相关的实际应用中,有向环特别的重要。

优先级限制下的调度问题:给定一组需要完成的任务,以及一组关于任务完成先后次序的优先级限制。在满足限制条件的前提下应该如何安排并完成所有任务?

对于任意一个这样的问题,我们都可以画出一张有向图,其中顶点对应任务,有向边对应优先级顺序。
优先级限制下的调度问题等价于计算有向无环图中所有顶点的拓扑排序


定义

给定一幅有向图,将所有的顶点排序,使得所有的有向边均从排在前面的元素指向排在后面的元素。

拓扑排序是对有向无环图的顶点的一种排序, 使得如果存在一条从v到w的路径,那么在排序中w就出现在v的后面。
如果图含有环,那么拓扑排序是不可能的。试想有3个正整数,a比b大,b比c大,c比a大,我们无法对abc排序。


有向环检测

如果一个有优先级限制的问题中存在有向环,那么这个问题肯定无解。要检查这种错误,需要进行有向环检测,即给定的有向图中包含有向环吗?

只需要找出一个环即可,而不是所有环。

基于深度优先搜索来解决这个问题并不困难,因为由系统维护的递归调用的栈表示的正是“当前”正在遍历的有向路径。一旦我们找到了一条边 v->w 且 w 已经存在于栈中,就找到了一个环,因为栈表示的是一条由 w 到 v 的有向路径,而 v->w 刚好补全了这个环。同时,如果没找到这样的边,就意味着这幅有向图是无环的。
在这里插入图片描述

/*
 * 寻找有向环
 */
public class DirectedCycle {
   
    private boolean[] marked;
    private int[] edgeTo;           // 在找到有向环后,环上的所有顶点可以通过edgeTo[]中的链接得到
    private Stack<Integer> cycle;   // 有向环中的所有顶点(如果存在)
    private boolean[] onStack;      // 保存递归调用的栈上的所有顶点。当找到一条边v->w且w在栈中时,就找到了一个有向环
    
    public DirectedCycle(Digraph G) {
   
        onStack = new boolean[G.V()];
        edgeTo = new int[G.V()];
        marked = new boolean[G.V()];
        for (int v = 0; v < G.V(); v++)
            if (!marked[v]) 
            	dfs(G, v);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值