关键路径问题(括扑排序扩展)

AOE网络: 有权的有向图中,顶点代表事件,权值代表事件活动事件,边代表事件活动。入度为零的顶点叫源点,出度=0顶点叫做汇点。

基础概念:

              关键路径:在AOE图中,从源点到汇点最长一条路径长度该路径上的各个活动所持续的时间之和)的路径称为关键路径。关键路径是AOE网络最短工期时间。
   关键活动:


(1).事件最早发生时间: ve[k]指从源点开始到顶点Vk最大路径长度,活动最早开始时间等于事件最早开始时间:Ve[k]=max{Ve[i]+len<Vi,Vk>}
(2). 事件最迟开始时间:从汇点到ve[k]逆序时间最小值。Vl[k]=min{Vl[j]-len<Vk,vj>};





编程: 求出最早开始时间和最晚开始时间,如果两者相等表示此顶点代表事件是关键事件,关键活动;
package com.Graph;

import java.util.ArrayList;

public class CriticalPath {

	public static void main(String[] args) {
		int [][]array={{0,1},{0,2},{1,3},{1,4},{2,3},{2,5},{3,4},{4,6},{4,7},{5,7}
		,{6,9},{7,8},{8,9}};
		int weight[]={3,4,5,6,8,7,3,9,4,6,2,5,3};
		
		int [] VNum={0,1,2,3,4,5,6,7,8,9};
		Graph graph=new Graph(VNum, weight.length, array, weight);
		criticalPath(graph);
	}

	public static ArrayList<Integer> criticalPath(Graph graph)
	{
		int ve[]=new int [graph.Vertex];// 最早开始时间
		int vl[]=new int [graph.Vertex];// 最迟开始时间
		
		for(int i=0;i<graph.Vertex;i++)
		{
			ve[i]=0;
			
		}
		
		/* 求最早开始时间*/
		for(int i=0;i<graph.Vertex;i++)
		{
			EdgeNode edge=graph.graph[i].firstedge;
			while(edge!=null)
			{
				if(ve[i]+edge.Weight>ve[edge.adjvex])
					ve[edge.adjvex]=ve[i]+edge.Weight;
				edge=edge.nextedge;
			}
		}
		System.out.print("最早开始时间:  ");
		Print(ve);
		
		/**求 最晚开始时间*/
		for(int i=0;i<graph.Vertex;i++)
			vl[i]=ve[graph.Vertex-1];
		for(int i=graph.Vertex-1;i>=0;i--)
		{
			EdgeNode edge=graph.graph[i].firstedge;
			int ver=graph.graph[i].Vertexnum;
			while(edge!=null)
			{
				if(vl[edge.adjvex]-edge.Weight<vl[ver])
					vl[ver]=vl[edge.adjvex]-edge.Weight;
				edge=edge.nextedge;
			}
		}
		
		System.out.print("最晚开始时间:  ");
		Print(vl);
		
		/**求出关键路径上的关键活动 最晚开始时间-最早开始时间=0的 事件
		 * **/
		ArrayList <Integer> list=new ArrayList<>();
		for(int i=0;i<graph.Vertex;i++)
		{
			if((ve[i]-vl[i])==0)
				list.add(i);
		}
		
		for(int i=0;i<list.size();i++)
			System.out.print(list.get(i)+" ");
		return list;
	}
	
	public static void Print(int a[])
	{
		for(int i=0;i<a.length;i++)
			System.out.print(a[i]+" ");
		System.out.println();
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值