文章目录
一、什么是拓扑排序?
对一个有向图,设G=(V,E),V表示的是顶点集合,E表示的是顶点间的边关系,若 Vi -> Vj存在路径,则Vi一定排在Vj之前,则我们称这样的顶点序列为拓扑序列,使之构成拓扑序列的过程叫做拓扑排序。
由上述可知,拓扑序列有几点特点:
- 有向图
- 无环
二、实现思想
由第一章节可知,根据拓扑排序思想,排在前列的都是没有指向的,所以我们首先要找入度为0的顶点,因为入度为0的顶点,不存在指向它的顶点,也就意味着没有排在它前面的顶点。
三、实现步骤
- 初始化图
- 初始化所有顶点的入度0
- 统计所有顶点的入度
- 找到入度为0的顶点入栈
- 栈顶元素出栈,找到栈顶元素指向其他顶点的边,并减少该顶点入度1,若此时如果该顶点入度为0的话就入栈。
- 循环步骤5,直至栈元素全部出栈。
四、代码实现
public class Test {
/**
* 端点矩阵 图
*/
private static final int[][] GRAPH;
/**
* 判断两节点是否存在边
*/
private static final int NOT_DIRECT_FLAG = -1;
/**
* 判断两节点存在边
*/
private static final int DIRECT_FLAG = 1;
static {
GRAPH = new int[14][14];
initGraph();
}
/**
* 初始化图表
*/
public static void initGraph() {
for (int i = 0; i < GRAPH.length; i++) {
for (int j = 0; j < GRAPH[i].length; j++) {
if (i == j) {
GRAPH[i][j] = 0;
} else {
GRAPH[i][j] = NOT_DIRECT_FLAG;
}
}
}
GRAPH[0][4] = DIRECT_FLAG;
GRAPH[0][5] = DIRECT_FLAG;
GRAPH[0][11] = DIRECT_FLAG;
GRAPH[1][4] = DIRECT_FLAG;
GRAPH[<

最低0.47元/天 解锁文章
2585

被折叠的 条评论
为什么被折叠?



