zoukankan      html  css  js  c++  java
  • 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;
    }

     

  • 相关阅读:
    SQL判断如果一列值为null则取另一列值代替 isnull()
    关于js的function.来自百度知道的回答,学习了.
    OSI七层与TCP/IP五层网络架构
    504 Gateway Time-out
    nginx中关于并发数的问题worker_connections,worker_processes
    php实现二叉树的遍历
    nginx负载均衡的简单实现
    linux shell数据重定向
    数据库范式的思考以及数据库的设计
    msyql中myism和innodb的区别
  • 原文地址:https://www.cnblogs.com/zmmm/p/13647876.html
Copyright © 2011-2022 走看看