拓扑排序
import java.util.*;
/**
* @author xnl
* @Description:
* @date: 2022/6/19 23:15
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
// int[][] prerequisites = {{1,2},{1,0},{2,0}}, queries = {{1,0},{1,2}};
int[][] prerequisites = {{1,0}}, queries = {{0, 1},{1,0}};
System.out.println(solution.checkIfPrerequisite(2, prerequisites, queries).toString());
}
/**
* 使用拓扑排序
* @param numCourses
* @param prerequisites
* @param queries
* @return
*/
public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {
// 存入度
int[] points = new int[numCourses];
// 存储相邻的边关系
int[][] edges = new int[numCourses][numCourses];
for (int i = 0; i < prerequisites.length; i++){
edges[prerequisites[i][0]][prerequisites[i][1]] = 1;
points[prerequisites[i][1]]++;
}
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < numCourses; i++){
if (points[i] == 0){
queue.offer(i);
}
}
// 出度
while (!queue.isEmpty()){
int p = queue.poll();
for (int i = 0; i < numCourses; i++){
// 看一下有没有匹配的下一条边
if (edges[p][i] == 1) {
// 招寻出对应的前一个节点的值,修改矩阵
for (int j = 0; j < numCourses; j++){
if (edges[j][p] == 1){
edges[j][i] = 1;
}
}
points[i]--;
if (points[i] == 0){
queue.offer(i);
}
}
}
}
List<Boolean> ans = new ArrayList<>();
for (int[] a : queries){
ans.add(edges[a[0]][a[1]] == 1);
}
return ans;
}
}
本文档介绍了一个使用Java实现的解决方案,通过拓扑排序算法处理课程之间的先决条件,用于判断是否满足查询中指定的课程依赖关系。核心内容包括创建图结构、计算节点度数、执行拓扑排序,并返回查询结果布尔列表。
390

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



