LeetCode 1462. 课程安排 IV
idea:BFS+set
data:20201014

#include <vector>
#include <list>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
/*******************/
//LeetCode 1462. 课程安排 IV 
//看了T101402LC例程后我的程序  C++、建图、BFS
/*******************/
class Solution {
public:
    vector<set<int>> WhocldAchThis;//“WhocldAchThis”存储的是对应行——所有可以到达这一点的点,通过后面迭代,不是直接到的也包含其中了
    vector<vector<int>> IcldAchWho;//“IcldAchWho”存储的是对应行——我可以 直接 到达的点
    
    vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
        WhocldAchThis.resize(n);
        IcldAchWho.resize(n);
        vector<int> InDegree(n, 0);//初始化为n个0
        InDegree.resize(n);
        //统计一下每个点的入度
        for (int i = 0; i < prerequisites.size(); i++) {
            IcldAchWho[prerequisites[i][0]].push_back(prerequisites[i][1]);
            InDegree[prerequisites[i][1]]++;
        }
        //开始BFS,第一次手动找一个入度为0的点,放进队列里面
        queue<int> que;
        for (int i = 0; i < InDegree.size(); i++) {//找初始的入度为0的点
            if (InDegree[i] == 0) {
                que.push(i);
            }
        }
        //根据模板,这里可以开始循环了
        while (!que.empty()) {
            int CurVal = que.front();
            que.pop();
            //对我能到达的所有点都进行遍历,我能到达的点保存在“IcldAchWho[CurVal][i]”中
            for (int i = 0; i < IcldAchWho[CurVal].size(); i++) {
                //第一部处理,把能到我的都给我的下一个
                WhocldAchThis[IcldAchWho[CurVal][i]].insert(WhocldAchThis[CurVal].begin(), WhocldAchThis[CurVal].end());
                //第二部处理,把我自己也给到下一个,我也是能到达下一个的 
                WhocldAchThis[IcldAchWho[CurVal][i]].insert(CurVal);
                //当操作完“我”之后,我所指向的人的入度都得减一
                InDegree[IcldAchWho[CurVal][i]]--;
                //如果我的入度为零,那也进入队列,等一会处理
                if (InDegree[IcldAchWho[CurVal][i]] == 0) {
                    que.push(IcldAchWho[CurVal][i]);
                }
            }
        }
        //for (int i = 0; i < WhocldAchThis.size(); i++) {
        //    for (set<int>::iterator j = WhocldAchThis[i].begin(); j != WhocldAchThis[i].end();j++) {
        //        printf("%d   ", *j);
        //    }
        //    printf("%n");
        //}
        //目前所有处理都已经完成,可以到达i的点都保存在WhocldAchThis[i]中,此时遍历queries比较就好
        vector<bool> res;
        for (int i = 0; i < queries.size(); i++) {
            if (WhocldAchThis[queries[i][1]].find(queries[i][0]) != WhocldAchThis[queries[i][1]].end()) {
                res.push_back(1);
            }
            else { res.push_back(0); }
        }
        return res;
    }
};