class Solution {
public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {
//1、建立拓扑图 先建一个list数组 每个数组元素 再建一个list 数组list存储每个起始点 后面再跟着动态的list 存储后继结点
List<Integer> g[] = new ArrayList[numCourses];
for(int i = 0;i < numCourses;i++){
g[i] = new ArrayList<Integer>();
}//存储每个起始点的后继结点
for(int p[] : prerequisites){
g[p[0]].add(p[1]);
}
boolean vi[] = new boolean[numCourses];
boolean isPre[][] = new boolean[numCourses][numCourses];
List<Boolean> ans = new ArrayList<>();
//2、查找所有先后关系 更新isPre
for(int i = 0;i < numCourses;i++){
dfs(g,isPre,vi,i);
}
for(int query[] : queries){
ans.add(isPre[query[0]][query[1]]);
}
return ans;
}
public void dfs(List<Integer>g[],boolean[][]isPre,boolean[]vi,int cur){
if(vi[cur]){
return;
}
vi[cur] = true;
for(int ne : g[cur]){
isPre[cur][ne] = true;//将所有后继结点加入
dfs(g,isPre,vi,ne); //以后继结点开始继续深搜
for(int i = 0;i < isPre.length;i++){ //将后继结点的后继结点加入
isPre[cur][i] = isPre[cur][i] || isPre[ne][i];//先修课传递
}
}
}
}
//拓扑排序 用啥存储呢
/**
有n门课 直接深搜 把每对俩门课是否具有先后关系都存着 查找O(1)
*/
DFS + 拓扑排序(1462. 课程表 IV)
最新推荐文章于 2024-07-19 19:11:19 发布