Leetcode 1462. 课程表 IV DFS+反向构图/Floyd/拓扑排序

news/2024/7/15 17:39:27 标签: 深度优先, leetcode, 算法, 图论, 力扣

原题链接:1462. 课程表 IV

在这里插入图片描述
在这里插入图片描述
DFS+反向构图

这个做法是参考了这道题:Leetcode 2192. 有向无环图中一个节点的所有祖先 逆向建图+DFS

class Solution {
public:
    vector<vector<int>> adj;
    map<pair<int,int>,int> mp;
    vector<vector<int>> rec;
    void dfs(int now)
    {
        for(auto x:adj[now])
        {
            if(!mp[{now,x}])
            {
                mp[{now,x}]=1;
                rec[now].push_back(x);
            }
            if(rec[x].size()==0) dfs(x);
            for(auto y:rec[x])
            {
                if(!mp[{now,y}])
                {
                    rec[now].push_back(y);
                    mp[{now,y}]=1;
                }
            }
        }
    }
    vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
        vector<bool> res;
        if(prerequisites.size()==0)
        {
            for(int i=0;i<queries.size();i++) res.push_back(false);
            return res;
        }
        adj.resize(numCourses);
        rec.resize(numCourses);
        for(auto x:prerequisites)   adj[x[1]].push_back(x[0]);
        for(auto x:queries)
        {
            if(mp[{x[1],x[0]}]) res.push_back(true);
            else 
            {
                dfs(x[1]);
                if(mp[{x[1],x[0]}]) res.push_back(true);
                else res.push_back(false);
            }
        }
        return res;

    }
};

Floyd 参考:1462. c++几乎双百的预计算解法

class Solution {
public:
    vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
        vector<bool> res;
        if(prerequisites.size()==0)
        {
            for(int i=0;i<queries.size();i++) res.push_back(false);
            return res;
        }
        vector<vector<bool>> g(numCourses,vector<bool>(numCourses,false));
        for(auto x:prerequisites)   g[x[0]][x[1]]=true;
        for(int k=0;k<numCourses;k++)
        {
            for(int i=0;i<numCourses;i++)
            {
                for(int j=0;j<numCourses;j++)
                {
                    if(g[i][k]&&g[k][j]) g[i][j]=true;
                }
            }
        }
        for(auto x:queries) res.push_back(g[x[0]][x[1]]);
        return res;
    }
};

拓扑排序: 参考:简单易懂的拓扑排序!

class Solution {
public:
    vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
        vector<bool> res;
        if(prerequisites.size()==0)
        {
            for(int i=0;i<queries.size();i++) res.push_back(false);
            return res;
        }
        vector<vector<int>> adj(numCourses);
        vector<int> indegree(numCourses);
        vector<set<int>> pre(numCourses);
        for(auto x:prerequisites)   
        {
            int a=x[0],b=x[1];
            adj[a].push_back(b);
            indegree[b]++;
        }
        queue<int> q; 
        for(int i=0;i<numCourses;i++)
        {
            if(!indegree[i]) q.push(i);
        }
        while(!q.empty())
        {
            int now=q.front(); q.pop();
            for(auto x:adj[now])
            {
                indegree[x]--;
                pre[x].insert(pre[now].begin(),pre[now].end());
                pre[x].insert(now);
                if(!indegree[x]) q.push(x);
            }
        }
        for(auto x:queries) 
        {
            if(pre[x[1]].find(x[0])!=pre[x[1]].end()) res.push_back(true);
            else res.push_back(false);
        }
        return res;
    }
};

http://www.niftyadmin.cn/n/1264502.html

相关文章

Leetcode 2285. 道路的最大总重要性 贪心

原题链接&#xff1a;Leetcode 2285. 道路的最大总重要性 class Solution { public:long long maximumImportance(int n, vector<vector<int>>& roads) {long long res0;vector<long long> degree(n);for(auto x:roads){degree[x[0]];degree[x[1]];}sort…

Leetcode 2101. 引爆最多的炸弹 预处理构图+DFS/BFS

原题链接:Leetcode 2101. 引爆最多的炸弹 DFS class Solution { public:int num0;vector<vector<int>> adj;void dfs(int now,vector<int>& visit){visit[now]1;num;for(auto x:adj[now]){if(!visit[x]) dfs(x,visit);}}int maximumDetonation(vector&…

Leetcode 1361. 验证二叉树 DFS/BFS/并查集

原题链接&#xff1a; DFS class Solution { public:vector<vector<int>> adj;vector<int> visit;int num0;void dfs(int now){visit[now]1;num;for(auto x:adj[now]){if(!visit[x]) dfs(x);}}bool validateBinaryTreeNodes(int n, vector<int>&a…

Leetcode 1514. 概率最大的路径 Dijkstra+修改+优化

原题链接&#xff1a;Leetcode 1514. 概率最大的路径 class Solution { public:struct cmp{bool operator() (const pair<int,double>& a,const pair<int,double>& b){return a.second<b.second;}};vector<double> d;vector<int> visi…

Leetcode 1584. 连接所有点的最小费用 最小生成树 prime/kruskal C++tuple的使用

原题链接&#xff1a;Leetcode 1584. 连接所有点的最小费用 prime&#xff1a; class Solution { public:vector<int> d;vector<int> visit;int cost0;void prime(vector<vector<int>>& points,int t,int n){d[t]0;for(int i0;i<n;i){int u-1,…

Leetcode 2039. 网络空闲的时刻 搜索+模拟

原题链接&#xff1a;添加链接描述 class Solution { public:int networkBecomesIdle(vector<vector<int>>& edges, vector<int>& patience) {int npatience.size();vector<int> d(n,INT_MAX);vector<vector<int>> adj(n);ve…

Leetcode 990. 等式方程的可满足性 Floyd/并查集+模拟

原题链接&#xff1a;Leetcode 990. 等式方程的可满足性 Floyd class Solution { public:bool equationsPossible(vector<string>& equations) {vector<vector<int>> g(26,vector<int>(26));for(int i0;i<26;i) g[i][i]1;for(auto x:equations…

Leetcode 2115. 从给定原材料中找到所有可以做出的菜 拓扑排序+hash+模拟

原题链接&#xff1a;Leetcode 2115. 从给定原材料中找到所有可以做出的菜 class Solution { public:vector<string> findAllRecipes(vector<string>& recipes, vector<vector<string>>& ingredients, vector<string>& supplies) {i…