拓扑排序测试用例
关键路径测试用例
源代码
public class TopologicalSort {
int numEdge; //边的个数
int numVertex; //顶点个数
VertexNode[] vertexNodes; //顶点数组
int[] etv;//C存放事件(顶点)的最早开始时间(Ealist Time Vertex)
int[] ltv;//C存放事件的最晚开始时间(Latest Time Vertex)
Stack<Integer> s = new Stack();//存放拓扑排序的结果,起点在栈底,终点在栈顶,用来计算事件的最晚开始事件
/**
* 建立拓扑图
* @param numV 图的顶点个数
* @param numE 图的边个数
* @param listEdge 存储边的指向,由前一个指向后一个
* @param listVertex 存储顶点的值
*/
public void creatTopo(int numV,int numE,List<Integer> listVertex,List<Integer> listEdge){
this.numVertex = numV;
this.numEdge = numE;
vertexNodes = new VertexNode[numV];
etv = new int[numV];
/*假设顶点 下标的值 和 顶点的值 相同*/
for(int i=0;i<numV;++i){
vertexNodes[i] = new VertexNode();
vertexNodes[i].data = listVertex.get(i);
vertexNodes[i].in =0; //所有顶点的入度初始化为0
}
for(int i=0;i<listEdge.size();i+=3){
int v1 = listEdge.get(i); //弧尾顶点
int v2 = listEdge.get(i+1);//弧头顶点
int w = listEdge.get(i+2);//有向边的权重
vertexNodes[v2].in += 1; //弧的指向弧头 入度 加一
TopoEdge e = new TopoEdge();
e.adjvex = v2;
e.weight=w;
/*插入弧尾顶点的邻接点链表*/
e.next = vertexNodes[v1].firstEdge;
vertexNodes[v1].firstEdge = e;
}
}
/**
* AOV网(Active on Vertex NetWork):无权有向图(无环),顶点表示活动,弧表示活动之间的优先关系
* 拓扑排序:对有向图构造拓扑序列的过程
*
* 算法思想: 1、首先保存初始图的入度为0的顶点
* 2、将入度为0的顶点访问执行后后,更新这些顶点所在边对应顶点的入度
* 3、再将这些入度为0的顶点保存后重复 步骤2
* 注意:如果执行完后访问的顶点数<全部顶点,说明图中存在环
*
* 结果:输出此图的拓扑排序
*/
public void Topo(){
/*将初始图 入度为0 的顶点存入队列(存的是顶点在顶点列表的下标)*/
Queue<Integer> q = new LinkedList<>();
for(int i=0;i<numVertex;++i){