# 【数据结构与算法】-＞算法-＞拓扑排序-＞如何确定代码源文件的编译依赖？

## Ⅱ 拓扑排序算法解析

package com.tyz.about_topo.core;

/**
* 构造有向无环图
* @author Tong
*/
public class Graph {
private int vertex; //顶点数

public Graph() {
}

@SuppressWarnings("unchecked")
public Graph(int vertex) {
this.vertex = vertex;

for (int i = 0; i < vertex; i++) {
}
}

public void addEdge(int start, int end) { //加有向边
}

}

public int getVertex() {
return vertex;
}

public void setVertex(int vertex) {
this.vertex = vertex;
}

}



### A. Kahn 算法

Kahn 算法实际上用的是贪心算法的思想，思路也比较清晰。

package com.tyz.about_topo.core;

/**
* 拓扑排序
* @author Tong
*/
public class TopoSort {
private Graph graph; //有向无环图
private int vertex; //图的顶点数

public TopoSort(int vertex) {
this.vertex = vertex;
this.graph = new Graph(vertex);
}

/**
* 用 Kahn算法 实现拓扑排序
*/
public void topoSortByKahn() {
int[] inDegree = new int[this.vertex]; //统计每个顶点的入度
for (int i = 0; i < this.vertex; ++i) {
for (int j = 0; j < this.graph.getAdj()[i].size(); ++j) {
inDegree[w]++;
}
}
for (int i = 0; i < this.vertex; ++i) {
if (inDegree[i] == 0) {
}
}
while (!queue.isEmpty()) {
int i = queue.remove();
System.out.println("->" + i);
for (int j = 0; j < this.graph.getAdj()[i].size(); ++j) {
inDegree[k]--;
if (inDegree[k] == 0) {
}
}
}
}

}



### B. DFS 算法

【数据结构与算法】-＞算法-＞深度优先搜索&广度优先搜索

package com.tyz.about_topo.core;

/**
* 拓扑排序
* @author Tong
*/
public class TopoSort {
private Graph graph; //有向无环图
private int vertex; //图的顶点数

public TopoSort(int vertex) {
this.vertex = vertex;
this.graph = new Graph(vertex);
}

/**
* 用 DFS算法 实现拓扑排序
*/
public void topoSortByDFS() {
@SuppressWarnings("unchecked")
for (int i = 0; i < this.vertex; ++i) {
for (int j = 0; j < this.graph.getAdj()[i].size(); ++i) {
}
}
boolean[] visited = new boolean[this.vertex];
for (int i = 0; i < this.vertex; ++i) { //深度优先遍历图
if (visited[i] == false) {
visited[i] = true;
}
}
}

/**
* 递归实现深度优先遍历
* @param vertex 当前顶点
* @param visited 顶点状态
*/
for (int i = 0; i < inverseAdj[this.vertex].size(); ++i) {
if (visited[w] == true) {
continue;
}
visited[i] = true;
}
System.out.println("->" + vertex); //输出完逆邻接表中这个顶点所达到的所有顶点后输出自己
}



### C. 算法时间复杂度

DFS 算法的时间复杂度在图的搜索算法中我详细分析过，每个顶点被访问了两次，每条边被访问了一次，所以时间复杂度也是 O(V+E)。

• 点赞 3
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏 4
• 手机看

分享到微信朋友圈

x

扫一扫，手机阅读

• 打赏

打赏

山河罔顾

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文
10-24
10-14

05-30 694
03-06 7万+
03-07 172
05-22 4186
11-01 4055