• 71课程表(207)


    作者: Turbo时间限制: 1S章节: 深度优先搜索

    晚于: 2020-08-26 12:00:00后提交分数乘系数50%

    截止日期: 2020-09-02 12:00:00

    问题描述 :

    你必须选修 numCourse 门课程,记为 0 到 numCourse-1 。

    在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]

    给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?

    示例 1:

    输入: 2, [[1,0]] 

    输出: true

    解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

    示例 2:

    输入: 2, [[1,0],[0,1]]

    输出: false

    解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。

    提示:

    输入的先决条件是由边组成,每条边包含两个元素,比如[1,0],表示学习课程 1 之前,需要先完成课程 0

    你可以假定输入的先决条件中没有重复的边。

    可使用以下main函数:

    int main()

    {

        vector<vector<int>> prerequisites;

        int numCourses,m;

        cin>>numCourses>>m;

        int c1,c2;

        int ch;

        for(int i=0; i<m; i++)

        {

            vector<int> aPrerequisite;

            cin>>c1>>c2;

            aPrerequisite.push_back(c1);

            aPrerequisite.push_back(c2);

            prerequisites.push_back(aPrerequisite);

        }

        bool res=Solution().canFinish(numCourses,prerequisites);

        cout<<(res?"true":"false")<<endl;

        return 0;

    }

    输入说明 :

    首先输入numCourses和先决条件的数目m

    然后输入m行,每行两个整数,表示先决条件中的两门课程编号。

    1 <= numCourses <= 2000

    输出说明 :

    输出true或false

    输入范例 :

    输出范例 :

    #include <iostream> 
    #include <vector>
    #include <queue>
    
    using namespace std;
    class Solution {
    private:
        vector<vector<int>> edges;
        vector<int> indegree;//保存每个点的入度 
    public:
        bool canFinish(int numCourses, vector<vector<int>>& prerequisites) 
        {
            edges.resize(numCourses) ;
            indegree.resize(numCourses);
            for(const auto &t:prerequisites)
            {
                edges[t[1]].push_back(t[0]);
                ++indegree[t[0]];
            }
           queue<int> Q;
           for(int i=0;i<numCourses;i++)
               if(indegree[i]==0)
                   Q.push(i);//先将所有入度为0的顶点存入队列 
               int visited=0;
               while(!Q.empty())
               {
                   ++visited;//访问出所有入度为0的点 
                   int temp=Q.front();
                   Q.pop();
                   for(int u:edges[temp])
                   {
                       --indegree[u];
                       if(indegree[u]==0)
                           Q.push(u);
                }
            }
            return visited==numCourses;//如果能够全部访问出所有顶点,证明无环 
        }
    };
    
    int main()
    {
        vector<vector<int>> prerequisites;
        int numCourses,m;
        cin>>numCourses>>m;
        int c1,c2;
        int ch;
        for(int i=0; i<m; i++)
        {
            vector<int> aPrerequisite;
            cin>>c1>>c2;
            aPrerequisite.push_back(c1);
            aPrerequisite.push_back(c2);
            prerequisites.push_back(aPrerequisite);
        }
    
        bool res=Solution().canFinish(numCourses,prerequisites);
        cout<<(res?"true":"false")<<endl;
        return 0;
    }

     

  • 相关阅读:
    netcore跨域问题与接口请求错误400
    JAVA基础
    Codeforces Round #738 (Div. 2) E.Mocha and Stars 容斥+DP
    Codeforces Round #737 (Div. 2) D. Ezzat and Grid DP+线段树优化
    牛客多校第四场 H.Convolution 数论 推式子
    51Nod-1514 美妙的序列 多项式求逆模板题
    牛客多校第4场 G.Product EGF解决排列问题
    上帝与集合的正确做法 拓展欧拉定理 欧拉函数性质
    [Codeforces Round #736 (Div. 2)](https://codeforces.com/contest/1549) E.F1 题解
    洛谷P7725 珍珠帝王蟹 分类讨论
  • 原文地址:https://www.cnblogs.com/zmmm/p/13647876.html
Copyright © 2020-2023  润新知