有向图的拓扑排序
拓扑排序是可以用图模拟的另外一种操作,他可以用于表示一种情况,某些事件必须按照特定的顺序排列或者发生。,比如说课程的优先关系。
拓扑排序算法思想不一般但是算法很简单
1:找到一个没有后继的顶点。
2:从图中删除这个顶点,在列表的前面插入该顶点标记。
重复步骤一和二直到所有的顶点的被删除这个时候列表显示的顺序就是拓扑排序。
拓扑排序的主要工作都是在while循环中进行的,这个循环直到顶点数目为0的时候才退出。
1:调用noSuccessors找到一个没有后继的顶点。
2:如果找到一个这样的顶点,把顶点放入到数组sortedArray[],并且从图中删除该顶点。
3:如果没有这样的顶点则图必然存在环。最后一个被删除的顶点出现在列表的头部,所以随着图中顶点个数的减少,顶点从sortedArray数组的最后开始,依次向前排列,如果有顶点还在图中但他们都有后继那么图必然存在环算法退出,如果没有环则while循环退出显示sortedArray数组中的数据,这时顶点是按照拓扑有序排列。noSuccessors()方法使用邻接矩阵找到没有后继的顶点。在外层的for循环中沿着每一行考察每一个顶点,在每一行中,用内层for循环扫描列,查找值为1的顶点,如果找到一个就说明顶点有后继,当找到一个1的时候跳出内层循环,考察下一个顶点。只有整个一行都没有1存在,才说明有一个顶点没有后继,这时就返回它的行号,如果没有这样的顶点就返回-1.
代码:
private int noSuccessors() { boolean isEdge; for(int row = 0;row<currentVertexs;row++) { isEdge = false; for(int col=0;col<currentVertexs;col++) { if(adjMat[row][col] > 0) { isEdge = true; break; } } if(!isEdge){ return row; } } return -1; }
删除一个顶点很容易,就是从点的数组中删除这个点,后面的点向前移动补上空位,同样的顶点的行和 列从邻接矩阵中删除,下面的行和右面的列来移动填补空位
删除顶点的方法代码如下: