C ++中的课程表IV

假设我们总共可以选n门课程,这些课程从0标记为n-1。

有些课程可能有直接的先决条件,例如,要选修课程0,我们首先要选修课程1,该课程以一对表示:[1,0]。

因此,如果我们有多个课程n,则有一个直接的先决条件对列表和一个查询对列表。

无论课程查询[i] [0]是否是课程查询[i] [1]的前提条件,您都应该找到答案。最后,我们必须返回布尔值列表,即给定查询的答案。

我们必须记住,如果课程a是课程b的前提,而课程b是课程c的前提,那么课程a是课程c的前提。

因此,如果输入像n = 3,先决条件= [[1,2 ,, [1,0],[2,0]],查询= [[1,0],[1,2]],则输出将是[true,true]

为了解决这个问题,我们将遵循以下步骤-

  • N:= 110

  • 定义数组ret

  • 在中定义一张映射

  • 对于v中的每个元素,执行

    • 在图表[it [0]]的末尾插入[1]

    • (将[it [1]]增加1)

  • 定义一个队列q

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • 将我插入q

    • 如果in [i]等于0,则-

  • 定义一个映射IDX

  • 对于初始化lvl:= 1,当非q为空时,更新(将lvl增加1),执行-

    • 节点:= q的第一个元素

    • 从q删除元素

    • 对于graph [node]中的每个元素

    • 插入q

    • 将x插入c [it]

    • (将[it]减少1)

    • 对于c [node]中的每个元素x,

    • 将节点插入c [it]

    • 如果in [it]等于0,则-

    • sz:= q的大小

    • 当sz不为0时,在每次迭代中减小sz,执行-

    • 对于x中的每个元素,执行

      • 在ret的末尾插入(在c [it [1]]中插入[it [0]的频率)

    • 返回ret

    例 

    让我们看下面的实现以更好地理解-

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<bool> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    const int N = 110;
    class Solution {
    public:
       vector <int> graph[N];
       map <int, set <int>> c;
       vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& v, vector<vector<int>>& x) {
          vector<bool> ret;
          map<int, int> in;
          for (auto& it : v) {
             graph[it[0]].push_back(it[1]);
             in[it[1]]++;
          }
          queue<int> q;
          for (int i = 0; i < n; i++) {
             if (in[i] == 0)
                q.push(i);
          }
          map<int, int> idx;
          for (int lvl = 1; !q.empty(); lvl++) {
             int sz = q.size();
             while (sz--) {
                int node = q.front();
                q.pop();
                for (auto& it : graph[node]) {
                   in[it]--;
                   for (auto& x : c[node])
                      c[it].insert(x);
                   c[it].insert(node);
                   if (in[it] == 0) {
                      q.push(it);
                   }
                }
             }
          }
          for (auto& it : x) {
             ret.push_back(c[it[1]].count(it[0]));
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> prerequisites = {{1,2},{1,0},{2,0}}, queries = {{1,0},{1,2}};
       print_vector(ob.checkIfPrerequisite(3, prerequisites, queries));
    }

    输入项

    3, {{1,2},{1,0},{2,0}}, {{1,0},{1,2}}

    输出结果

    [1, 1, ]