拓扑排序
拓扑排序,首先它是一种排序。不过是应用在有向无环图上,将图的结点按照某种规则排成一个线性队列。只不过排序的规则是
对于任意两个结点(u,v),如果他们之间存在边(u->v),那么u必须出现在v之前。

满足拓扑排序的一个有向无环图
那么按照上面的规则我们可以这样实现拓扑排序
1: 找到所有初始入度为0的节点,并将它们放入队列或者栈中,并记录此时入度为0的数目。
2:遍历队列中的结点,对每一个结点,遍历它的直接相连的结点。并将它们入度减一,如果入度为0,将该节点放入队列,更新入度为0的数目(+1)。
3:重复2中操作,直到队列中元素为空,此时比较入度为0的数目和图的总结点数是否相等。如果相等,则可以满足拓扑排序(也就是判断图不存在环),反之不满足。
import java.util.Stack;
/**
* 为了简单起见 使用了邻接矩阵
* sort具体过程如上述所说
*/
public class TopoSort {
public static boolean sort(int[][] matrix, int[] degree) {
Stack<Integer> stack = new Stack();
int count = 0;
for (int i = 0; i < degree.length; i++) {
if (degree[i] == 0) {
stack.push(i);
count++;
}
}
while (!stack.isEmpty()) {
int temp = stack.pop();
for (int i = 0; i < matrix[temp].length; i++) {
if (matrix[temp][i] == 1) {
degree[i]--;
if (degree[i] == 0) {
stack.push(i);
count++;
}
}
}
}
return count == matrix.length;
}
public static void main(String[] args) {
int[][] matrix = {{0, 1, 1, 0, 0},
{0, 0, 1, 1, 0},
{0, 0, 0, 1, 1},
{0, 0, 1, 0, 1},
{0, 0, 0, 0, 0}};
int[] degree = {0, 1, 3, 2, 2};
System.out.println(sort(matrix,degree));
}
}

浙公网安备 33010602011771号