Day 56 总结
- 自己实现中遇到哪些困难
- 今日收获,记录一下自己的学习时间
- 18:00 - ???
拓扑排序
-
节点存在依赖关系,对这些依赖进行线性规划
-
有向无环图 进行线性排序的算法 都可以叫做 拓扑排序
-
BFS实现
- 找到入度为0 的节点,加入结果集
- 将该节点从图中移除
-
判断有环
- 当不存在入度为0的节点时,结果集元素个数 不等于 图中节点个数,存在环
-
代码
-
记录度数
-
收集结果
-
图的构建
-
117 软件构建
题目连接: 117. 软件构建
题目描述:
文件 0 - N-1, 文件之间存在依赖关系,确定文件处理顺序。
输入:
N 个文件, M个依赖关系 + S -> T
输出:
按序处理文件的顺序
实现思路:
BFS法,找到入度为0的节点,删除其依赖,加入结果集。
java
public class Main {
public static void main (String[] args){
new Main().solve();
}
public void solve() {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] degreess = new int[N];
int[][] graph = new int[N][N];
int[] res = new int[N];
int[] visited = new int[N];
// 获取图的信息,记录入度
int M = in.nextInt();
for (int i=0; i<M; i++) {
int S = in.nextInt();
int T = in.nextInt();
graph[S][T] = 1;
degreess[T]++;
}
// 拓扑排序
for (int i=0; i<N; i++) {
// 挑选入度为0的节点
int node = -1;
for (int j=0; j<N; j++) {
if (visited[j] == 0 && degreess[j] == 0){
node = j;
visited[node] = 1;
break;
}
}
// 遇到环
if (node == -1) {
System.out.println(-1);
return;
}
// 将该几点从图中移除
for (int j=0; j<N; j++) {
if (graph[node][j] == 1) {
degreess[j] --;
}
}
// 添加至结果集合
res[i] = node;
}
for (int i=0; i<N-1; i++)
System.out.print(res[i] + " ");
System.out.println(res[N-1]);
}
}