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;
}

 

 

posted on 2020-09-10 19:52  Hi!Superman  阅读(245)  评论(0)    收藏  举报

导航