AOV网的概念java
在一个有向图中,若是用顶点表示活动,用弧表示活动间的前后顺序,该有向图称为顶点活动网络,简称为AOV网,有向无环图 = 无环AOV网node
拓扑排序的概念算法
从一个有向无环图,排出一个顶点的序列,对任一顶点,其前驱都出如今它的前面,其后继都出如今它的后面。网络
拓扑排序的算法测试
任选一个入度为0的顶点,访问之this
从图中删除此顶点,及它发出来的弧spa
重复前两部,直到输出全部顶点对象
java实现,首先咱们须要先构建一个有向无环图排序
Graph graph = new Graph();
String nodeNames[] = {"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg"};
for (String s : nodeNames) {
graph.nodes.add(new Node(s));
}rem
graph.arcs = new int[nodeNames.length][nodeNames.length];
graph.arcs[0][1] = 1;
graph.arcs[1][2] = 1;
graph.arcs[3][4] = 1;
graph.arcs[4][2] = 1;
graph.arcs[2][5] = 1;
graph.arcs[6][5] = 1;
为了方便你们理解,画了一张图
而后是拓扑排序的java实现,具体流程再也不赘述,说几个须要注意的点
一、由于过程中涉及到删除,这里用一个map把原图的全部顶点装起来,key为顶点顺序,value为顶点对象
二、须要用一个set把全部已删除顶点记录下来
三、对边的删除,并无真的执行删除操做,只是在查找入度的时候,把已删除顶点都忽略掉。
public void sortAOV(){
int visitedCnt = 0;
Map<Integer, Node> newNodeMap = new HashMap<>();
for (int i = 0; i < this.nodes.size(); i ++){
newNodeMap.put(i, this.nodes.get(i));
}
Set<Integer> cutedIndexSet = new HashSet<>();
while(visitedCnt < this.nodes.size()){
for (int i : newNodeMap.keySet()){
if (this.getID(i, cutedIndexSet) == 0){
this.nodes.get(i).visit();
visitedCnt ++;
newNodeMap.remove(i);
cutedIndexSet.add(i);
break;
}
}
}
}
private int getID(int i, Set<Integer> cutedIndexSet){
int res = 0;
for (int j = 0; j < this.nodes.size(); j ++){
if (!cutedIndexSet.contains(j) && arcs[j][i] > 0) {
res ++;
}
}
return res;
}
下面是输出:
aaa
bbb
ddd
eee
ccc
ggg
fff
还能够测试一下非连通的状况,把顶点ggg,设为不跟任何其余顶点邻接,测试结果为:
aaa
bbb
ddd
eee
ccc
fff
ggg
正确!