域名网站怎么打开,房地产市场现状分析2023,公众号开发百修网,wordpress取消邮箱题目描述#xff1a;  你总共需要上 numCourses 门课#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite #xff0c;其中 prerequisites[i]  [ai, bi] 表示如果你想选 bi 课程#xff0c;你 必须 先选 ai 课程。 
有的课会有直接的先修课程  你总共需要上 numCourses 门课课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite 其中 prerequisites[i]  [ai, bi] 表示如果你想选 bi 课程你 必须 先选 ai 课程。 
有的课会有直接的先修课程比如如果想上课程 1 你必须先上课程 0 那么会以 [0,1] 数对的形式给出先修课程数对。 
先决条件也可以是 间接 的。如果课程 a 是课程 b 的先决条件课程 b 是课程 c 的先决条件那么课程 a 就是课程 c 的先决条件。 
你也得到一个数组 queries 其中 queries[j]  [uj, vj]。对于第 j 个查询您应该回答课程 uj 是否是课程 vj 的先决条件。 
返回一个布尔数组 answer 其中 answer[j] 是第 j 个查询的答案。 
示例 1 输入numCourses  2, prerequisites  [[1,0]], queries  [[0,1],[1,0]]
输出[false,true]
解释课程 0 不是课程 1 的先修课程但课程 1 是课程 0 的先修课程。 示例 2 
输入numCourses  3, prerequisites  [[1,2],[1,0],[2,0]], queries  [[1,0],[1,2]]
输出[true,true] 数据范围 
2  numCourses  1000  prerequisites.length  (numCourses * (numCourses - 1) / 2)prerequisites[i].length  20  ai, bi  n - 1ai ! bi每一对 [ai, bi] 都 不同先修课程图中没有环。1  queries.length  1040  ui, vi  n - 1ui ! vi 分析思路 首先看样例的图大概率是图论题再一个题目中有很明显的先后关系所以可以锁定这个题是一道拓扑排序题。 当然这个题范围很小 n是100Floyd的3层循环好像也能求解类似传递闭包)代码应该更容易实现。 不过我想用bitset实现那样的话 数据n如果开1e410000) 也没事 bitset的空间复杂度是(n*n/64). AC的过程还是有点艰难之前写题没怎么用过vector刚才初始化少加1 看了半天 o.O。 因为题目编号范围是0~n-1不太习惯怕0这个数字会未知错误, 所以我给所有的编号都进行了1处理 f[x][y]为1 表示x-y有边;  为0 表示无边    
class Solution {
public:vectorbool checkIfPrerequisite(int numCourses, vectorvectorint prerequisites, vectorvectorint queries) {vectorintd(numCourses1);vectorvectorint edge(numCourses1);for(vectorint x:prerequisites){edge[x[0]1].push_back(x[1]1);//建边d[x[1]1]; //处理入度}queueintq;for(int i1;inumCourses;i){if(!d[i]){q.push(i);}}vectorintans;//ans里面存的是拓扑序列注意拓扑序列不是唯一的while(q.size()){int tq.front();q.pop();ans.push_back(t);for(int x:edge[t]){if(--d[x]0){q.push(x);}}}bitset110f[numCourses1];for(int inumCourses-1;i0;i--){int xans[i];for(int y:edge[x]){f[x][y]1;f[x]|f[y];//相当于位运算,时间复杂度是O(1)}}//处理答案vectorboolans1;for(auto x:queries){if(f[x[0]1][x[1]1])ans1.push_back(1);else ans1.push_back(0);}return ans1;}
};