数据结构:关键路径,利用DFS遍历每一条关键路径JAVA语言实现

Posted dark_Souls

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构:关键路径,利用DFS遍历每一条关键路径JAVA语言实现相关的知识,希望对你有一定的参考价值。

     这是我们学校做的数据结构课设,要求分别输出关键路径,我查遍资料java版的只能找到关键路径,但是无法分别输出关键路径

     c++有可以分别输出的,所以在明白思想后自己写了一个java版的

     函数带有输入函数也有已经存进去的图

    

    如上图关键路径被分别输出(采用了DFS算法):

     例:AOE 图如下:

  

 

      算法设计如下:

       1. 首先,要求关键路径,要先要先写拓扑排序,如果图中有环,就无法进行关键路径的求解,直接跳出。

   拓扑排序:利用栈stack,先将入度为0事件节点的加入栈中,然后编历后面的活动节点,每次给活动节点的入度减一,然后将入度为0的加入栈       stack中,每次出栈的加入栈stack中,stack1中的元素拓扑排序的逆序,然后根据核心算法:

    if(etv[p.getData()]+p1.getInfo()>etv[p1.getAdjvex()]){
    etv[p1.getAdjvex()]=etv[p.getData()]+p1.getInfo();
    }

计算出事件的最早发生时间的事件存入etv

    然后根据count来判断图中有没有回路。

2. 然后对拓扑排序的逆序求事件的最晚发生时间,根据核心法:

     if (ltv[p1.getAdjvex()]-p1.getInfo()<ltv[p.getData()]){
    ltv[p.getData()]=Math.abs(ltv[p1.getAdjvex()]-p1.getInfo());
        }

    算出事件的最晚发生时间存入数组ltv中。

3. 接着求活动的最晚发生时间el和活动的最早发生时间ee

         ee=etv[i];
    el=ltv[pn.getAdjvex()]-pn.getInfo();

    ee和el相等的时候,本活动就为关键活动,关键路径算出来了。

     解决输出每条关键路径:

4. 输出每一条关键路径:利用DFS算法(回溯算法),

图在遍历以前已经将关键路径用visited数组标记了,

故遍历的时候只遍历关键路径,

原理如图:

 

visited0的时候为关键节点,然后遍历此节点进入递归:

while (p!=null){
     if(visited[p.getAdjvex()]!=1){
        /**
         * 是关键路径就入栈
         */
        stack2.push(p);
        DFS(p.getAdjvex());
        /**
         * 遇见死路回退的时候出栈
         */
        stack2.pop();
    }

本算法类似走迷宫,并且每走一个点,就把这个点入栈,并且将visited数组中的本节点的值存为1,代表遍历过了:

                visited[k]=1;

然后递归进入下一个节点,遇见终点就先遍历并输出栈中的元素:

if(k==finall) {
     for (int i=0;i<stack2.size;i++) {
        System.out.print(stack2.peekTravel(i).getName() + "->");
        }
    } 

一边退回一边出栈:

  DFS(p.getAdjvex());
        /**
         * 遇见死路回退的时候出栈
         */
        stack2.pop();

即栈中元素只到分岔点,退回上一次的分岔点,然后递归进入下一条路,直到遍历结束,然后输出了全部的关键路径。

                 

 

DFS算法全部代码:

/**
 * 为了输出每条关键路径用到DFS算法
 * @param k 起点再数组中的下标
 */
public void DFS(int k){
    visited[k]=关键路径分析

旅行商问题分析(分支限界法)

数据结构学习笔记——图的应用2(拓扑排序关键路径)

数据结构学习笔记——图的应用2(拓扑排序关键路径)

数据结构学习笔记——图的应用2(拓扑排序关键路径)

2017-3-3校内训练