数据结构:关键路径,利用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数组标记了,
故遍历的时候只遍历关键路径,
原理如图:
当visited为0的时候为关键节点,然后遍历此节点进入递归:
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]=关键路径分析